我正在寻找一种在cmake中处理链接库的好方法。在我的例子中,cmake配置文件(CMakeLists.txt)在Linux环境中和Windows上的cygwin上执行。 构建过程包含两个库。 libA是从源代码构建的,只依赖于std。 C API。 libB也是从源构建的,包括libA。 libs是单独构建的(使用自己的git repro)。
在cmake中定义“libB / CMakeLists.txt”
find_library (libB A)
我将libB与libA相关联。在cygwin下链接时,此行失败。当我将其更改为
时find_library (libB ${CMAKE_LIBRARY_PATH}/static/libA.dll.a)
它有效。
两个lib都构建为共享库。
“LIBA /的CMakeLists.txt”:
add_library(libA SHARED ${libA_source})
install(
TARGETS libA
RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}/static
)
和
“libB /的CMakeLists.txt”:
add_library(libB SHARED ${libB_source})
install(
TARGETS libB
RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}/static
)
在Linux下,这很好用。 libs放在“/ user / local / lib”中。在Windows下,libs被放入“/ user / local / lib / shared”+ dll被放入“/ user / local / bin”。
将libB与libA链接的语句更改为(“libB / CMakeLists.txt”):
if (UNIX)
find_library (libB A)
elseif (CYGWIN)
find_library (libB ${CMAKE_LIBRARY_PATH}/static/libA.dll.a)
endif()
任何想法如何在简单 - 可能 - 平台独立的行中处理这两个构建的链接器引用?
答案 0 :(得分:1)
这应该在你的libB / CMakeLists.txt中起作用:
find_library(libA
NAMES A libA libA.so libA.dll libA.dll.a
HINTS ${CMAKE_INSTALL_FULL_LIBDIR}
)
target_link_libraries(libB ${libA})
使用
检查libA的路径message(STATUS "libA=${libA}")