Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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编译静态可执行文件_C++_Opencv_Compilation_Cmake_Cgal - Fatal编程技术网

C++ 使用CMake编译静态可执行文件

C++ 使用CMake编译静态可执行文件,c++,opencv,compilation,cmake,cgal,C++,Opencv,Compilation,Cmake,Cgal,对于一个项目,我需要创建一个包含我使用的所有库(opencv、cgal)的可执行文件,以便在没有这些库的计算机上执行它。目前,这是我的CMakeLists.txt(我使用linux) 这样,只有GMP和一些其他C++库包含在我的可执行文件中。我的问题是:如何创建一个makefile,以便以静态方式自动包含所有库,并只创建一个包含所有库的“大”可执行文件?您能帮助我吗?作为全局CMake设置,在添加可执行文件之前添加以下行,对gcc/clang有效: set(CMAKE_FIND_LIBRARY_

对于一个项目,我需要创建一个包含我使用的所有库(opencv、cgal)的可执行文件,以便在没有这些库的计算机上执行它。目前,这是我的CMakeLists.txt(我使用linux)


这样,只有GMP和一些其他C++库包含在我的可执行文件中。我的问题是:如何创建一个makefile,以便以静态方式自动包含所有库,并只创建一个包含所有库的“大”可执行文件?您能帮助我吗?

作为全局CMake设置,在添加可执行文件之前添加以下行,对gcc/clang有效:

set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
set(BUILD_SHARED_LIBS OFF)
set(CMAKE_EXE_LINKER_FLAGS "-static")
Modern CMake(3.x+-)上,可以通过以下方式将标志应用于特定目标:

target_link_libraries(your_target_name -static)
如果使用的是MSVC,则必须设置编译器和链接器标志:

set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib")
target_compile_options(your_target_name [PUBLIC|PRIVATE] /MT)
target_link_options(your_target_name [PUBLIC|PRIVATE] /INCREMENTAL:NO /NODEFAULTLIB:MSVCRT)
如果您使用的是MFC,则需要将标志指定为
1


添加可执行文件(MyExec“main.c”)
之后添加这些行(例如:

target\u link\u库(MyExec PUBLIC)-静态“


或之前:
链接库(“-static”)

您不应该使用
文件(GLOB…
来收集源文件。添加新文件时,它将无法正常工作。你的问题是什么也不清楚。<代码> AddioLooScript(导入)调用也没有做任何事情。我需要创建一个包含所有库(OpenCV、CGAL和所有常见C++库)的可执行文件。为了在其他计算机上执行OpenCV或CGAL或其他C++库的可执行文件,首先需要确保所有依赖的库都是静态构建的。事实往往并非如此。在此之后,您需要确保您的
find_package
调用找到这些静态库。是的,我知道这一点,我的问题是:如何包含.a文件。Andrea,您的问题到底是什么?在你的帖子里,唯一的问题是“你能帮我吗?”。您应该编辑您的帖子,并至少描述到目前为止您的测试存在哪些问题。@Royi对于MSVC,您应该使用标志/MT/INCREMENTAL:NO/NODEFAULTLIB:MSVCRT。Xcode使用了叮当声,而-static标志就是Windows:SET(CMAKE\u FIND\u LIBRARY\u后缀.a;.dll.a)
target\u link\u libraries(您的\u target\u name-static)
这太棒了!
set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib")
target_compile_options(your_target_name [PUBLIC|PRIVATE] /MT)
target_link_options(your_target_name [PUBLIC|PRIVATE] /INCREMENTAL:NO /NODEFAULTLIB:MSVCRT)
 set(CMAKE_MFC_FLAG 1)