在CMake中查找目录
我正在尝试构建一个静态库,并将其用于编译 fortran文件。如果我这样做:在CMake中查找目录,cmake,Cmake,我正在尝试构建一个静态库,并将其用于编译 fortran文件。如果我这样做: 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)
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
如果我省略了最后两行,那么归档文件就会
按预期将libmylib.a写入lib子目录。如果我这样做
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命令和目标链接库
变量是不同的情况-我不明白的事情之一
这就是为什么只有在运行make而不是cmake时才会失败;如果
变量是相同的情况,然后我得到与上面相同的错误)
那么,如何让CMake识别我的${PROJECT\u BINARY\u DIR}/lib
在CMake运行期间创建的文件夹?有人能指出我的名字吗
(可能很明显)错了 您不应在某个目标上使用
find_library
,请删除以下行:
find_library(mylib NAMES mylib PATHS ${archives})
CMake已经知道mylib
库,因为它是它的目标之一,调用find\u library
会隐藏mylib
变量
您可以保持对
target\u link\u库的调用相同,因为参数可以是库或目标的路径。r您不应在其中一个目标上使用find\u library
,请删除以下行:
find_library(mylib NAMES mylib PATHS ${archives})
CMake已经知道mylib
库,因为它是它的目标之一,调用find\u library
会隐藏mylib
变量
您可以保持对target\u link\u库的调用相同,因为参数可以是库的路径,也可以是目标。r