2013-06-18 135 views
0

我在尝试构建一个静态库并将其用于编译一个 fortran文件。如果我做的:在CMake中查找目录

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) 
add_library(mylib STATIC ${lib_src}/mylib.for) 
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/bin) 
add_executable(bin/out ${PROJECT_SOURCE_DIR}/src/program.f) 
target_link_libraries(bin/out mylib) 

那么它所有的作品(注意库内置到二进制文件目录 根,但FORTRAN编译成子目录);但是,如果我做

set(archives ${PROJECT_BINARY_DIR}/lib) 
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) 
add_library(mylib STATIC ${lib_src}/mylib.for) 
find_library(mylib NAMES mylib PATHS ${archives}) 
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/bin) 
add_executable(bin/out ${PROJECT_SOURCE_DIR}/src/program.f) 
target_link_libraries(bin/out mylib) 

,当我跑我得到一个错误的cmake:

CMake Error: The following variables are used in this project, but they are set to NOTFOUND. 
Please set them or make sure they are set and tested correctly in the CMake files: 

mylib linked by target "bin/out" in directory /home/chris/project 

如果我离开了最后2行,然后存档文件并获得 写入到lib子目录,作为libmylib.a预期。如果我做

set(archives ${PROJECT_BINARY_DIR}/lib) 
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) 
add_library(mylib STATIC ${lib_src}/mylib.for) 
find_library(mylib NAMES mylib PATHS ${archives}) 
include_directories(${archives}) 
set(libs ${libs} ${mylib}) 
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/bin) 
add_executable(bin/out ${PROJECT_SOURCE_DIR}/src/program.f) 
target_link_libraries(bin/out {LIBS}) 

然后CMake的命令运行正常,但运行make然后生成 编译错误(我知道set命令和target_link_libraries 变量不同的情况 - 的东西我不明白 是一个为什么这只在make运行时失败,而不是cmake;如果 变量是相同的大小写,那么我得到与上面相同的错误)。

那么,我怎样才能让CMake识别在CMake运行期间创建的我的${PROJECT_BINARY_DIR}/lib 文件夹?有人能指出我的 (可能很明显)的错误吗?!

回答

4

你不应该在你的目标的一个使用find_library,删除行:

find_library(mylib NAMES mylib PATHS ${archives}) 

CMake的已经的已知,有关mylib库,因为它是其目标之一,并呼吁find_library阴影mylib变量。

你可以让你的target_link_libraries调用相同,因为参数可以是库或目标的路径.r