使用CMake和Cygwin将一个动态库链接到另一个动态库时未定义的引用

时间:2015-05-05 06:16:36

标签: c++ linker cmake cygwin undefined-reference

我环顾四周,似乎没有在任何地方讨论我的问题的解决方案。所以,我在这里写。

我创建了一个用于生成多个Python库的CMake项目。我使用Boost.Python来包装我的C ++代码,CMake来构建动态库。一切都在Cygwin平台上。项目的最高层是非常标准的 - 最终通过以下方式导致源目录:

ADD_SUBDIRECTORY("src")

/ src目录包含两个子文件夹--mmath和ann - 每个子文件夹都用于自己的库。此级别的CMake文件是:

MESSAGE("Going into subdirectory mmath...")
ADD_SUBDIRECTORY("mmath")
MESSAGE("Going into subdirectory ann...")
ADD_SUBDIRECTORY("ann")

所以我们首先构建mmath库:

file(GLOB MMATH_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/*.h)
file(GLOB MMATH_SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp ${MMATH_HEADERS}) 
SET( ext_libs 
     ${Boost_LIBRARIES}
     ${PYTHON_LIBRARIES}/libpython2.6.dll
   )
ADD_LIBRARY(mmath SHARED ${MMATH_SRC})
TARGET_LINK_LIBRARIES(mmath ${ext_libs})

它完美无缺。然后可以将生成的动态库作为模块导入到Python中(在cygwin中,库前面加上" cyg"前缀,而不是" lib")。除此之外,库定义了一个DATA类,它本质上是一个自定义容器(标准类型变量的集合),非常简单。 现在,当CMake进入/ src / ann目录时,它会尝试构建相应的cygann.dll(cygwin约定)库,这取决于我们已经构建的mmath库。 CMake脚本是:

file(GLOB ANN_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/*.h)
file(GLOB ANN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp ${ANN_HEADERS}) 
SET( ext_libs1
     mmath
     ${Boost_LIBRARIES}
     ${PYTHON_LIBRARIES}/libpython2.6.dll
   )
ADD_LIBRARY(ann SHARED ${ANN_SRC})
TARGET_LINK_LIBRARIES(ann ${ext_libs1})

在src / ann目录中,我们有一个定义类Ann的文件,它具有std :: vector类型的成员。链接问题本身就是在这里:DATA类在链接阶段引起一些问题 - "未定义的引用"错误。错误表明DATA类的构造函数和析构函数都没有定义:

CMakeFiles/ann.dir/libann.cpp.o: In function `Destroy<libmmath::DATA>':
/usr/lib/gcc/i686-pc-cygwin/4.8.3/include/c++/bits/stl_construct.h:93: undefined reference to `libmmath::DATA::~DATA()'

CMakeFiles/ann.dir/libann.cpp.o: In function `Construct<libmmath::DATA, libmmath::DATA>':
/usr/lib/gcc/i686-pc-cygwin/4.8.3/include/c++/bits/stl_construct.h:83: undefined reference to `libmmath::DATA::DATA(libmmath::DATA const&)'

所以我想知道可能是什么问题。这与CMake功能,cygwin技巧有关还是与代码本身有关?好吧,我觉得问题不太可能与代码本身有关,因为它适用于标准利用(静态exe或只是一个动态库)。我很可能忽略了CMake或cygwin。但是什么?请帮忙。提前谢谢。

0 个答案:

没有答案