2011-06-03 59 views
1

只有在编译了外部项目后才能找到一个包,因为一旦编译了这个外部项目就会创建要找到的包。如何在编译相应的外部项目后找到软件包?

现在,我有:

include(ExternalProject) 
externalproject_add(
    libantlr3c 
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3 
    CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3/configure -prefix=${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3 
    PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3 
    BUILD_COMMAND make 
    BUILD_IN_SOURCE 1 
) 

find_library(
    antlr3c 
    libantlr3c.a 
    HINTS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3 
) 

失败,当然。

谢谢。

+0

这看起来很难,因为,正如你注意到,该文件不存在,直到你建立它。如果你的外部项目很简单,你可能想为它创建一个'CMakeLists.txt'。 – tibur 2011-06-03 13:52:19

+0

不,我真的需要外部项目,否则,项目总是被认为是过时的。我需要一个懒惰的find_library。 – 2011-06-03 14:10:34

回答

3

由于您控制了库的创建位置,因此不需要使用find_library。您可以直接使用link_directories。您可能会希望include目录的相同路径将include路径添加到编译行。像这样的东西应该这样做:

include(ExternalProject) 
set(antlr3c_LIBRARIES 
    ${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3) 
set(antlr3c_INCLUDE_DIRS 
    ${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3/include) 
externalproject_add(
    libantlr3c 
    .... 
) 
link_directories(${antlr3c_LIBRARIES}) 
include_directories(${antlr3c_INCLUDE_DIRS}) 
add_executable(my_exe ${SOURCES}) 
target_link_libraries(my_exe antlr) # or antlr3c or whatever -lantlr is needed 
+0

我直接使用link_libraries。谢谢 ! – 2011-06-03 19:38:28

+0

如果构建许多可执行文件,但并非所有这些文件都依赖于外部项目库,这似乎并不理想。看起来最好只在每个可执行的基础上添加链接/包含目录。这对于CMake来说是不可能的吗? – 2017-03-29 11:52:58

相关问题