带有CMake 3和共享库的Visual Studio Express 12(2013)提供了LNK1104错误

Hou*_*dog 3 dll cmake shared-libraries visual-studio-2013

我有以下CMakeLists.txt

project(testproject)
cmake_minimum_required(VERSION 2.8.4)

add_library(library lib.cpp)

add_executable(test.x main.cpp)
target_link_libraries(test.x library)
Run Code Online (Sandbox Code Playgroud)

如果我为visual studio构建一个项目

cmake path\to\project
Run Code Online (Sandbox Code Playgroud)

然后在visual studio express 12中打开解决方案我没有问题.但是,如果我用它构建项目

cmake -DBUILD_SHARED_LIBS=ON path\to\project
Run Code Online (Sandbox Code Playgroud)

然后我在visual studio中收到以下错误:

LINK : fatal error LNK1104: cannot open file 'Debug\library.lib'
Run Code Online (Sandbox Code Playgroud)

这似乎是因为,根据我的指定,visual studio构建了文件'Debug\library.dll'

如果我做一个linux makefile构建,一切正常.

那么......任何想法为什么visual studio仍然在寻找静态库?这是一个cmake bug,还是我做过的事情?

我在windows-side开发方面不是很有经验,所以我很感激你能给予的任何帮助.谢谢!

小智 5

可能这是因为你没有"出口"任何东西.

如果您创建库foo:

add_library(foo foo.cpp foo.hpp)
Run Code Online (Sandbox Code Playgroud)

foo_EXPORTS如果共享库正在构建,CMake将为您提供宏:

cl /c ... /D foo_EXPORTS
Run Code Online (Sandbox Code Playgroud)

您可以使用此宏来声明您的函数,如下所示:

// foo.hpp
#if defined(_WIN32) 
# if defined(foo_EXPORTS)
#  define FOO_EXPORT __declspec(dllexport)
# else
#  define FOO_EXPORT __declspec(dllimport)
# endif // Foo_EXPORTS
#else // _WIN32
# define FOO_EXPORT
#endif

FOO_EXPORT int foo();
Run Code Online (Sandbox Code Playgroud)

更新

可以使用GenerateExportHeader模块自动生成标头:

// foo.hpp
#include "foo_export.h" // foo_export.h is generated for you
FOO_EXPORT int foo();

# CMakeLists.txt
include(GenerateExportHeader) # include module with function `generate_export_header`
include_directories("${PROJECT_BINARY_DIR}") # this is the default directory for generated header, i.e. location of generated file `${PROJECT_BINARY_DIR}/foo_export.h`

add_library(foo foo.cpp foo.hpp)
generate_export_header(foo) # create `foo_export.h`
Run Code Online (Sandbox Code Playgroud)