Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cmake:如何像autotool那样安装include/和lib/目录_C++_Cmake_Autoconf_Automake_Libtool - Fatal编程技术网

C++ cmake:如何像autotool那样安装include/和lib/目录

C++ cmake:如何像autotool那样安装include/和lib/目录,c++,cmake,autoconf,automake,libtool,C++,Cmake,Autoconf,Automake,Libtool,我有一个老项目,我想利用cMake而不是旧的自动工具 旧程序所做的是,在键入make之后,它将在名为.libs的隐藏文件夹中生成libtest.a、libtest.la、libtest.so.1.0等,然后在键入make install之后,它将把所有库装入目标文件夹$TEST\u ROOT/lib(环境变量),它还将所有.h文件装入$TEST\u ROOT/include文件夹 在Makefile.am中: source_list=test1.cpp test2.cpp include_HEA

我有一个老项目,我想利用cMake而不是旧的自动工具

旧程序所做的是,在键入make之后,它将在名为.libs的隐藏文件夹中生成libtest.a、libtest.la、libtest.so.1.0等,然后在键入make install之后,它将把所有库装入目标文件夹$TEST\u ROOT/lib(环境变量),它还将所有.h文件装入$TEST\u ROOT/include文件夹

在Makefile.am中:

source_list=test1.cpp test2.cpp
include_HEADERS=test1.h test2.h
AM_LDFLAGS="-pthread -lm -lrt"
lib_LTLIBRARIES=libtest.la
libtest_la_SOURCES=$(source_list)
libtest_la_LDFLAGS=$(AM_LDFLAGS) -static-libgcc
在configure.ac中,我只看到一行相关内容

if test -n "${TEST_ROOT}"; then
    ac_default_prefix=${TEST_ROOT}
    includedir=${ac_default_prefix}/include
fi
坦白地说,我真的不明白为什么上面的代码会一起生成.a、.la、.so等库,然后将它们安装到相应的文件夹中。可能自动工具可以识别“ac_默认_前缀”和“includeddir”

无论如何,我想用cmake做同样的事情,下面是我的尝试,但不是一个完整的解决方案

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/.libs)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY $(CMAKE_BINARY_DIR}/.libs)

set(CMAKE_CXX_FLAGS "-O3 -Wall")
set(CMAKE_EXE_LINKER_FLAGS "-pthread -lm -lrt")

file(GLOB SOURCES "*.cpp")
add_library(test STATIC ${SOURCES})
上面的代码将编译build文件夹中的libtest.a,而不是build文件夹中的.libs文件夹(这意味着CMAKE\u RUNTIME\u OUTPUT\u目录等不起作用)

其次,它将只构建libtest.a,没有libtest.la,没有libtest.so.1.0.0等等

第三,我仍然不知道如何让安装像自动工具一样工作。我可以只设置目标include目录和目标lib目录,然后让install将所有.h文件和.so、.a、.la文件安装到目标目录中吗

请帮忙


谢谢。

您必须转到CoreResponding
CMakeLists.txt
并添加例如

INSTALL(TARGETS test DESTINATION lib)
在root
CMakeLists.txt
中,您可以确定标准安装路径:

SET(CMAKE_INSTALL_PREFIX ".")
通过类似的方式,您可以安装头文件:

FILE(GLOB files "${CMAKE_CURRENT_SOURCE_DIR}/*.hxx")
INSTALL(FILES ${files} DESTINATION include)
您可以在以下网址找到更多示例:

然后可以使用make()安装文件和lib:


您可能还需要设置
CMAKE\u ARCHIVE\u OUTPUT\u目录


除此之外,请注意CMake不像自动工具那样工作。如果您需要多个库,则需要多个
add_library
调用。

CMake具有用于安装的特殊命令-。检查文档,也许事情会变得清楚。对于变量
CMAKE\u*\ u OUTPUT\u目录
,每个变量只影响特定类型的库/可执行文件。静态库受影响。另外,在构建静态库时,为什么希望构建
.la
.so
?目前,你的问题有太多的子问题,试着集中在其中一个。我完全同意太多子问题的说法。谢谢你的回答。目前,它是谷歌为这个主题提供的主要搜索结果之一。同时,您在回复中链接到的CMake:Install_Commands页面从wiki移动到。
make DESTDIR=/home/mistapink install