Как скомпилировать 64-битную dll, написанную на C?

У меня есть программа на 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). Как изменить тип библиотечного компьютера?

@jdv Он его игнорирует, поэтому нет

c0degreen 04.05.2018 00:39

@ c0degreen Не дублирует, но связано: stackoverflow.com/questions/2548138/…

Unmanned Player 04.05.2018 00:51

@jdv Должен уточнить, это компилятор Visual Studio (cl.exe). Вы знаете альтернативу, которую я мог бы использовать?

c0degreen 04.05.2018 01:25

Пожалуйста, ответьте редактировать на вопрос и четко укажите, какой набор инструментов вы используете.

user1531971 04.05.2018 01:26

Вы используете командную строку разработчика или командную строку собственных инструментов x64?

Retired Ninja 04.05.2018 01:40

@RetiredNinja "Командная строка разработчика для VC 2017"

c0degreen 04.05.2018 02:00

Используйте подсказку x64.

Retired Ninja 04.05.2018 02:18

Я не могу найти, где это. Ты знаешь?

c0degreen 04.05.2018 02:53

В моей системе есть несколько вариантов: Программы / Инструменты Visual Studio / Командные строки рабочего стола Windows.

prl 04.05.2018 04:37

@prl, я нашел 84-битную версию cl.exe uder C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Community \ VC \ Tools \ MSVC \ 14.13.26128 \ bin \ Hostx64 \ ‌ x64, однако, когда я запускаю его, я получаю то, что добавил в обновлении

c0degreen 04.05.2018 16:02
vcvarsall.bat ("C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64 - расположение VC2017 немного странно) - это файл, который установит все соответствующие переменные env для сборки на разных архитектурах из командной строки. Отметьте stackoverflow.com/questions/44450813/… (в 1-й части я объясню, как его использовать). Что касается ошибки в последнем комментарии, просто удалите файл .obj и повторно запустите команду.
CristiFati 04.05.2018 16:13

@CristiFati, пожалуйста, добавьте это в ответ, так как он устранил мои проблемы. Огромное спасибо!

c0degreen 04.05.2018 16:20

Рад это слышать! Всего одну секунду, поскольку я готовлю небольшой (и фиктивный) пример.

CristiFati 04.05.2018 16:24

Возможный дубликат Как скомпилировать код x64 с Visual Studio в командной строке?

Andrew Henle 04.05.2018 17:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
14
3 264
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как я объяснил в начале [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

Заметки:

  • Мой путь vcvarsall настраивается, потому что я установил VStudio2017 в разделе «C: \ Install \ x86 \ Microsoft \ Visual Studio Сообщество \ 2017». Путь по умолчанию - "% SystemDrive% \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Сообщество"
  • После запуска vcvarsall мне не нужно указывать cl.exe (или link.exe):
    • Полный путь
    • Параметры сборки (в зависимости от архитектуры, включая пути)
    • Мне все еще нужно указать вещи, о которых он не знает (например, материал Ява)
  • Чтобы протестировать недавно созданный .dll, я собираюсь использовать Python, так как это проще, чем писать другую программу .c, которая его использует.
  • Поскольку я связал .dll с jvm.lib, во время выполнения ему потребуется jvm.dll, поэтому я добавляю его путь в %ДОРОЖКА%
  • Я создал свой код с помощью VStudio2017 (VCRuntime14.0), но jvm.dll связан с VCRuntime10.0 (VStudio2010), что означает, что в мою программу будет загружено (как минимум) 2 Видеомагнитофон. Этого следует избегать, так как это может привести к разного рода неприятным проблемам.
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
>>>

Другие вопросы по теме