CMake:在Visual Studio上链接库

时间:2017-10-19 09:28:42

标签: visual-studio dll cmake

我试图在Windows上制作CMakeklist.txt文件,我遇到了很大的问题。

我写了

cmake_minimum_required(VERSION 3.1.2)

project(c_api)

set(INC_PATH target/release/deps)
set(PROJECT_DLL traffic.dll)
set(PROJECT_LIB traffic.dll.lib)

configure_file(${INC_PATH}/${PROJECT_DLL} ${CMAKE_CURRENT_BINARY_DIR} COPYONLY)
include_directories(${INC_PATH}/include)
add_library(traffic UNKNOWN IMPORTED)
set_property(TARGET traffic PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_DLL})
set_property(TARGET traffic PROPERTY IMPORTED_IMPLIB ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_LIB})

file(GLOB SOURCES "c_api/examples/ai_module/*.c")
add_executable(ai_module
${SOURCES}
)
target_link_libraries(ai_module traffic )

我运行CMake生成的项目

LNK1107 invalid or corrupt file: cannot read at 0x2D8

我认为问题是add_library(traffic UNKNOWN IMPORTED),但如果我将其更改为add_library(traffic SHARED IMPORTED)我就会

LNK2019 unresolved external symbol _traffic_import_osm referenced in function _main ai_module

所以我假设Visual Studio没有看到库。

我在linux上运行此代码,我只更改了.dll的{​​{1}}格式,它运行正常。

我在CMake上使用Visual Studio 15 2017

2 个答案:

答案 0 :(得分:0)

根据documentation of your first error,您似乎正在尝试直接链接到.dll。在Windows上,共享库需要两个文件。共享.dll,包括库中函数和类的所有定义,以及.lib(使用dll构建时)仅包含声明。存根.lib文件在编译时用于告诉链接器对函数的期望。

你有.lib和.dll吗?如果您没有.lib,则无法将.dll链接到您的程序。

答案 1 :(得分:0)

我解决了这个问题。 CMake制作32位的项目,我的.dll是64位,现在是它的工作