即使库已链接,也会出现CMake可执行链接器错误

时间:2015-09-15 10:46:48

标签: c++ linker cmake

我对CMake很新,但我遇到了一个我不理解的错误。

由于给定的原因,我有以下C ++设置:我有两个自己的静态库,多个外部静态库和一个可执行文件。我自己的库a定义了常见的东西,所有外部库都链接到它中。我的库b定义了更多特殊内容,并将库a链接到其中。最后,b已链接到我的可执行文件cbc都使用来自不同外部库的函数,这些函数应通过a显示。

我有以下CMakeLists.txt,我只使用一个外部库来减少问题:ZeroC Ice。

Root CMakeLists.txt

cmake_minimum_required (VERSION 3.3.0)
project (myproject)

# some settings
if (CMAKE_COMPILER_IS_GNUCC)
    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fmessage-length=0")
endif (CMAKE_COMPILER_IS_GNUCC)
if (CMAKE_COMPILER_IS_GNUCXX)
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fmessage-length=0")
endif (CMAKE_COMPILER_IS_GNUCXX)
set (CMAKE_VERBOSE_MAKEFILE ON)
set (CMAKE_SHARED_LINKER_FLAGS "-Wl,--export-all-symbols")
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
include_directories (${CMAKE_CURRENT_SOURCE_DIR})

# ZeroC Ice
find_package (Ice 3.6.0 REQUIRED COMPONENTS Ice IceUtil)
include_directories (${Ice_INCLUDE_DIRS})

# libraries and executable
add_subdirectory (a)
add_subdirectory (b)
add_subdirectory (c)

a

的CMakeLists.txt
set (a_FILES
    stuff.cpp
)
add_library (a STATIC ${a_FILES})

# link to third-party libraries
target_link_libraries (a PUBLIC
    ${Ice_LIBRARIES}
)

b

的CMakeLists.txt
set (b_FILES
    more_stuff.cpp
)
add_library (b STATIC ${b_FILES})

# link to a
target_link_libraries (b PUBLIC
    a
)

c

的CMakeLists.txt
set (c_FILES
    main.cpp
)
add_executable (c ${c_FILES})

# link to b
target_link_libraries (c PUBLIC
    b
)

在此示例中,stuff.cppmore_stuff.cppmain.cpp使用Ice库中的类。 a奇怪地甚至b编译和链接没有任何问题。只有c会抛出许多类似的链接器错误:

  

C:/PROGRA~2/ZeroC/ICE-36~1.0/include/Ice/FactoryTableInit.h:27:未定义引用`_imp ___ ZN11IceInternal16FactoryTableInitD1Ev'

对我来说,CMakeLists.txt设置看起来很好,并且googleing几天没有改变任何东西。我将不胜感激任何帮助!

我正在使用CMake 3.3.1和CMake Generator“Eclipse CDT4 - MinGW Makefiles”(g ++版本4.8.1)开发Windows 10。

提前致谢! :)

修改

c的g ++链接器输出显示它尝试链接liba.a libb.a C:/.../ice.lib C:/.../iceutil.lib,这对我来说似乎没问题。无论如何,undefined reference链接器错误发生在头文件中,其类在ice.lib内实现,所以我不知道这里出了什么问题......

2 个答案:

答案 0 :(得分:1)

ab是静态库,它们只是带有外部引用符号的被控制对象,不会发生链接。 c是一个可执行文件,它最终解析这些符号并链接依赖项。它看起来不像CMake向上传输Ice library链接,你可以尝试将她链接到可执行文件。

答案 1 :(得分:-1)

我找到了一个"解决方法"我自己:使用另一个CMake生成器。通过使用Visual Studio作为底层编译器和链接器,问题不会出现。似乎问题是混合.a.lib库。由于Windows上的默认Ice安装仅提供 SELECT hw_edited_client_idfs , MAX(hw_edited_date) AS last_edit_dt FROM tbl_hw_edited GROUP BY hw_edited_client_idfs 个文件,因此我最终切换到VS,一切正常。