我对CMake很新,但我遇到了一个我不理解的错误。
由于给定的原因,我有以下C ++设置:我有两个自己的静态库,多个外部静态库和一个可执行文件。我自己的库a
定义了常见的东西,所有外部库都链接到它中。我的库b
定义了更多特殊内容,并将库a
链接到其中。最后,b
已链接到我的可执行文件c
。 b
和c
都使用来自不同外部库的函数,这些函数应通过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
set (a_FILES
stuff.cpp
)
add_library (a STATIC ${a_FILES})
# link to third-party libraries
target_link_libraries (a PUBLIC
${Ice_LIBRARIES}
)
b
set (b_FILES
more_stuff.cpp
)
add_library (b STATIC ${b_FILES})
# link to a
target_link_libraries (b PUBLIC
a
)
c
set (c_FILES
main.cpp
)
add_executable (c ${c_FILES})
# link to b
target_link_libraries (c PUBLIC
b
)
在此示例中,stuff.cpp
,more_stuff.cpp
和main.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
内实现,所以我不知道这里出了什么问题......
答案 0 :(得分:1)
a
和b
是静态库,它们只是带有外部引用符号的被控制对象,不会发生链接。 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,一切正常。