在Cygwin下使用CMake编译库

时间:2010-09-21 18:18:26

标签: c++ cygwin cmake tinyxml

我一直在尝试使用CMake编译TinyXML作为一种迷你项目,试图学习CMake。作为补充,我试图让它编译成动态库并自行安装以便它可以工作。

到目前为止,我已经设法让它编译和安装但是它编译成.dll和.dll.a并且让它工作的唯一方法是将它安装到/ bin和/ lib中,这使得它在两个文件夹中都安装了两个文件。这个设置有效,但我猜测.dll应该在/ bin中,而.dll.a应该在/ lib中。这是某种特定于Cygwin的问题还是我做错了什么?

2 个答案:

答案 0 :(得分:3)

.dll是运行时库文件,它必须在运行时存在于目标系统上(并且在$ PATH中)。 .dll.a文件是.dll的导入库,它必须在链接时出现在编译机器上。您需要将.dll文件分发到程序应运行的位置,并将.dll和.dll.a分发到使用该库链接其他程序的位置。你不需要运行程序的机器上的.dll.a文件。

如果您不想创建共享库,可以告诉它使用add_library命令中的static keyword进行cmake:

add_library(mylib STATIC foo.c bar.cpp)

这样就不会创建共享库,但链接器会将库中的代码添加到最终的可执行文件中。

答案 1 :(得分:0)

您需要为每种类型的文件指定目的地。

.dll被认为是RUNTIME库,而.a是ARCHIVE。为了以防万一,对于其他平台,您可能需要LIBRARY条目(对于.so文件)。

install( TARGETS ${PROJECT_NAME}
  LIBRARY DESTINATION lib
  ARCHIVE DESTINATION lib
  RUNTIME DESTINATION bin
)