Создание .dll из выходных данных ISPC в CMake приводит к ошибкам компоновщика.

Я пытаюсь создать библиотеку .dll в CMake, содержащую функции ispc, но во время процесса я получаю ошибки компоновщика. Я следую шагам, описанным здесь для Linux, в Windows, используя сгенерированный CMake проект Visual Studio, который, похоже, не работает.

В целях тестирования я создал файл adder.ispc, из которого я создаю .obj с помощью компилятора ISPC, в CMake я достиг этого следующим образом:

      add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/adder.obj ${PROJECT_BINARY_DIR}/include/milkyray/adder.h
                COMMAND "C:/Program Files/ISPC/ispc-v1.17.0-windows/bin/ispc.exe" --target=avx2 --arch=x86-64 ${PROJECT_SOURCE_DIR}/src/adder.ispc --header-outfile=${PROJECT_BINARY_DIR}/include/milkyray/adder.h -o ${PROJECT_BINARY_DIR}/adder.obj
                DEPENDS ${PROJECT_SOURCE_DIR}/src/adder.ispc

)

Далее следуют add_library, SET_TARGET_PROPERTIES и target_include_directories.

      add_library(adder
    SHARED
    ${PROJECT_BINARY_DIR}/adder.obj)

SET_TARGET_PROPERTIES(
    adder
    PROPERTIES
    LINKER_LANGUAGE C 
)
target_include_directories(adder PUBLIC ${PROJECT_BINARY_DIR}/include)

Я связываю свой исполняемый файл с библиотекой adder (и другой, содержащей только обычный C++):

      add_executable(app main.cpp)

target_link_libraries(app greeter adder)

Однако, когда я настраиваю и строю, я получаю неразрешенные внешние символы. _fltusedа также _DllMainCRTStartup:

      Microsoft (R) Build Engine version 17.1.0+ae57d105c for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.

  Checking Build System
  Generating ../adder.obj, ../include/milkyray/adder.h
  Building Custom Rule D:/Programming/milkyray/src/CMakeLists.txt
  Auto build dll exports
     Creating library D:/Programming/milkyray/build/src/Release/adder.lib and object D:/Programming/milkyray/build/src/
  Release/adder.exp
adder.obj : error LNK2001: unresolved external symbol _fltused [D:\Programming\milkyray\build\src\adder.vcxproj]
LINK : error LNK2001: unresolved external symbol _DllMainCRTStartup [D:\Programming\milkyray\build\src\adder.vcxproj]
D:\Programming\milkyray\build\src\Release\adder.dll : fatal error LNK1120: 2 unresolved externals [D:\Programming\milky
ray\build\src\adder.vcxproj]
  Building Custom Rule D:/Programming/milkyray/src/CMakeLists.txt
  greeter.cpp
  Auto build dll exports
     Creating library D:/Programming/milkyray/build/src/Release/greeter.lib and object D:/Programming/milkyray/build/sr
  c/Release/greeter.exp
  greeter.vcxproj -> D:\Programming\milkyray\build\src\Release\greeter.dll

Кажется, не имеет значения, если я выберу STATICили же SHAREDдля библиотеки сумматоров. Удаление команды также ничего не меняет. Если я использую скомпилированный ISPC .obj в качестве прямого ввода в моем исполняемом файле, он связывается без ошибок и запускает приложение, но я хотел бы, чтобы функциональность сумматора содержалась в .dll для повторного использования в нескольких приложениях.

По-видимому, ISPC заставляет экспортируемые функции иметь связь с C, так что, возможно, это то, что сбивает с толку компоновщика. Я не уверен, как бы вы указали это в CMake для вывода, созданного пользовательской командой, поскольку вы можете указать только цели. Спецификация LINKER_LANGUAGEв SET_TARGET_PROPERTIESкоманда выше, похоже, относится не к сгенерированному объектному файлу, а к .dll, который я хочу создать. Но, возможно, дело не в этом.

0 ответов

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