使链接增强.LNK2005错误
CMake linking to boost. error LNK2005
一整天都在寻找解决办法,但没有任何收获。
我有一个CMake解决方案与2个项目。一个是链接到boost的静态库,另一个是链接到boost和我自己的静态库的可执行文件。问题是:在Linux中,它可以用gcc编译。但是在VS2008中,我只得到以下类型的program_options链接器错误。
libboost_program_options-vc90-mt-gd-1_46_1.lib(options_description.obj) : error LNK2005: "public: class boost::program_options::options_description_easy_init & __thiscall boost::program_options::options_description_easy_init::operator()(char const *,char const *)" (??Roptions_description_easy_init@program_options@boost@@QAEAAV012@PBD0@Z) already defined in boost_program_options-vc90-mt-gd-1_46_1.lib(boost_program_options-vc90-mt-gd-1_46_1.dll)
看起来它链接到静态库和dll库…但是为什么呢?
所以我有一个解决方案目录与CMakeFile像这样:
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT( BBlockTools )
SET( TopDir ${CMAKE_CURRENT_SOURCE_DIR} )
ADD_SUBDIRECTORY( Utilities )
ADD_SUBDIRECTORY( BBlockFixer )
然后是两个项目目录。Utilities是一个静态库,通过CMakeFile创建:
PROJECT( Utilities )
SET(Boost_USE_STATIC_LIBS ON)
FIND_PACKAGE(Boost COMPONENTS system program_options REQUIRED)
LINK_DIRECTORIES ( ${Boost_LIBRARY_DIRS} )
INCLUDE_DIRECTORIES ( ${Boost_INCLUDE_DIRS} )
SET( src_h Utilities.h )
SET( src_cpp Utilities.cpp )
ADD_LIBRARY( Utilities STATIC ${src_h} ${src_cpp} )
TARGET_LINK_LIBRARIES( Utilities
${Boost_SYSTEM_LIBRARY}
${Boost_PROGRAM_OPTIONS_LIBRARY}
${Boost_LIBRARIES}
)
和这个CMakeFile创建的第二个项目:
PROJECT( BBlockFixer )
SET(Boost_USE_STATIC_LIBS ON)
FIND_PACKAGE(Boost COMPONENTS system filesystem program_options REQUIRED)
LINK_DIRECTORIES ( ${BBlockTools_BINARY_DIR}/Utilities/Debug ${Boost_LIBRARY_DIRS} )
INCLUDE_DIRECTORIES ( ${TopDir} ${Boost_INCLUDE_DIRS} )
SET( src_cpp fixerMain.cpp )
ADD_EXECUTABLE( BBlockFixer ${src_cpp} )
TARGET_LINK_LIBRARIES( BBlockFixer
Utilities
${Boost_FILESYSTEM_LIBRARY}
${Boost_PROGRAM_OPTIONS_LIBRARY}
${Boost_SYSTEM_LIBRARY}
${Boost_LIBRARIES}
)
我是CMake的新手,所以我可能会做一些非常糟糕的事情,但我真的不知道发生了什么。我开始玩周围的VS项目(Fixer)像删除链接输入到program_options,这解决了问题(直到我再次运行cmake)。但我认为这不是解决方案,因为从它看起来它链接到dll库和静态库出于某种原因…我试着从TARGET_LINK_LIBRARIES和FIND_PACKAGE的program_options中删除${Boost_PROGRAM_OPTIONS_LIBRARY}从BBlockFixer,但没有帮助。
从我的理解在CMake我的BBlockFixer继承链接到program_options从我的静态库,这应该都很好。但是这个boost_program_options-vc90-mt-gd-1_46_1.lib(boost_program_options-vc90-mt-gd-1_46_1.dll)在哪里链接到我的项目?
任何帮助都会很感激,因为我变得绝望了。其实没那么难…
p。我设置的这个TopDir是为了包含实用程序中的.h文件。但我相信一定有更干净的方法,还是?
我猜您仍然是自动链接的:在MSVC上,boost使用一些pragma来自动指示编译器链接到必要的库,这样就不需要手动指定所有的链接目标到链接器。当然,这与CMake的依赖解析和手动指定target_link_libraries有关。
看看我对一个类似问题的回答,我建议使用以下额外的定义来禁用自动链接:
add_definition( -DBOOST_ALL_NO_LIB )
根据Boost版本和组件的不同,动态链接时可能需要添加以下内容:
add_definitions( -DBOOST_ALL_DYN_LINK )
还请注意,您在find_package()调用中指定所需的Boost组件,然后在target_link_libraries()调用中再次手动指定它们。根据您的需要,您还可以将其替换为
target_link_libraries( ${Boost_LIBRARIES} )
- 错误LNK2005无法解决问题的解决方案
- C++错误LNK2005和不同项目文件的常规继承
- 使用 AMD 的 Vulkan 内存分配器时出现链接器错误 (LNK2005)
- 错误LNK2005结构已在.obj文件中定义
- 错误 LNK2005:构造函数已定义
- 重新定义函数,同时将文件包含在C++中(错误 LNK2005)
- 使用Visual Studio的Windows中的链接器错误(LNK2005)
- C++ 错误LNK2005和错误LNK1169
- 错误LNK2005和错误LNK2019
- 错误 11 错误 LNK2005:已在 MyForm.obj 中定义"class cv::Mat imageOutput" (?imageOutput@@3VMat@cv@@A)
- 错误LNK2005构造函数已定义
- 错误 LNK2005:"class Player m_player"已在 Game.obj 中定义
- 错误LNK2005,已定义
- 错误 LNK2005:"already defined in SkinHeaderCtrl.obj"
- 链接错误LNK2005多个CUDA文件
- 链接文件错误,VS 2015中的错误LNK2005
- 当包含全局函数时,c++错误lnk2005
- 错误LNK2005:已在hold.obj中定义_main
- 错误 LNK2005:已在 functions.obj 中定义"int __cdecl number(void)" (?number@@YAHXZ)
- 添加新头文件时出现C++错误LNK2005