У меня есть программа на Java, которая использует вызовы некоторых собственных функций для ускорения кодирования видео. Для этого требуется DLL, которую я напишу на C (у меня сейчас только тестовая).
Когда я компилирую DLL с помощью cl /I "java-path/include" /"java-path/include/win32" -DL -ML Main.c -FeTest.dll, она компилируется, но я получаю 32-битную DLL. Проведя небольшое исследование в Интернете, я обнаружил, что вместо этого мне понадобится 64-битная DLL.
После дополнительных исследований я нашел эта почта, который является единственным для C (даже C++ было трудно найти), но это работает, только если вы пишете / строите через Visual Studio 2010. Я использую Elipse для Java, CLion для C и компиляция через «Командную строку разработчика». так что это не работает для меня. Как я могу перекомпилировать как 64-битную DLL?
Обновлено: я использую cl.exe, который поставляется с Visual Studio 2017
ОБНОВЛЕНИЕ: я нашел 64-битный cl.exe в C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\bin\Hostx64\x64\cl.exe, однако при его запуске я получаю сообщение об ошибке, что тип библиотечного компьютера (x86) конфликтует с целевым типом (x64). Как изменить тип библиотечного компьютера?
@ c0degreen Не дублирует, но связано: stackoverflow.com/questions/2548138/…
@jdv Должен уточнить, это компилятор Visual Studio (cl.exe). Вы знаете альтернативу, которую я мог бы использовать?
Пожалуйста, ответьте редактировать на вопрос и четко укажите, какой набор инструментов вы используете.
Вы используете командную строку разработчика или командную строку собственных инструментов x64?
@RetiredNinja "Командная строка разработчика для VC 2017"
Используйте подсказку x64.
Я не могу найти, где это. Ты знаешь?
В моей системе есть несколько вариантов: Программы / Инструменты Visual Studio / Командные строки рабочего стола Windows.
@prl, я нашел 84-битную версию cl.exe uder C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Community \ VC \ Tools \ MSVC \ 14.13.26128 \ bin \ Hostx64 \ x64, однако, когда я запускаю его, я получаю то, что добавил в обновлении
"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64 - расположение VC2017 немного странно) - это файл, который установит все соответствующие переменные env для сборки на разных архитектурах из командной строки. Отметьте stackoverflow.com/questions/44450813/… (в 1-й части я объясню, как его использовать). Что касается ошибки в последнем комментарии, просто удалите файл .obj и повторно запустите команду.
@CristiFati, пожалуйста, добавьте это в ответ, так как он устранил мои проблемы. Огромное спасибо!
Рад это слышать! Всего одну секунду, поскольку я готовлю небольшой (и фиктивный) пример.
Возможный дубликат Как скомпилировать код x64 с Visual Studio в командной строке?





Как я объяснил в начале [SO]: Как создать DLL-версию libjpeg 9b? (Ответ @ CristiFati) (маркеры из раздела 1. Подготовьте землю), существуют разные способы работы со сборкой из командной строки в VStudio.
Я собираюсь сосредоточиться на vcvarsall.bat. Подробнее о [MSDN]: установка переменных пути и среды для сборок из командной строки (это VStudio2015, так как ссылка VStudio2017 не работает).
I подготовил фиктивный пример.
code.c:
#include <stdio.h>
#include "jni.h"
__declspec(dllexport) int func() {
JavaVMInitArgs args;
printf("Pointer size: %lld bits\n", sizeof(void*) * 8);
printf("JNI_GetDefaultJavaVMInitArgs returned: %d\n", JNI_GetDefaultJavaVMInitArgs(&args));
return 0;
}
Строить:
e:\Work\Dev\StackOverflow\q050164687>"c:\Install\x86\Microsoft\Visual Studio Community\2017\VC\Auxiliary\Build\vcvarsall.bat" amd64 ********************************************************************** ** Visual Studio 2017 Developer Command Prompt v15.6.6 ** Copyright (c) 2017 Microsoft Corporation ********************************************************************** [vcvarsall.bat] Environment initialized for: 'x64' e:\Work\Dev\StackOverflow\q050164687>dir /b code.c e:\Work\Dev\StackOverflow\q050164687>cl /nologo /LD /I"c:\Install\x64\Oracle\Java\jdk1.8.0_152\include" /I"c:\Install\x64\Oracle\Java\jdk1.8.0_152\include\win32" /DWIN64 /DWIN32 code.c /link /LIBPATH:"c:\Install\x64\Oracle\Java\jdk1.8.0_152\lib" /OUT:dummy.dll jvm.lib code.c Creating library code.lib and object code.exp e:\Work\Dev\StackOverflow\q050164687>dir /b code.c code.exp code.lib code.obj dummy.dll
Заметки:
e:\Work\Dev\StackOverflow\q050164687>set PATH=%PATH%;c:\Install\x64\Oracle\Java\jdk1.8.0_152\jre\bin\server e:\Work\Dev\StackOverflow\q050164687>"e:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" Python 3.5.4 (v3.5.4:3f56838, Aug 8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import ctypes >>> dummy = ctypes.CDLL("dummy.dll") >>> dummy.func() Pointer size: 64 bits JNI_GetDefaultJavaVMInitArgs returned: -1 0 >>>
@jdv Он его игнорирует, поэтому нет