在正常生产过程中, 很少使用命令行编译和运行静态链接库和动态链接库 ,而是 使用 CMake 完成静态链接库和动态链接库的编译

以 04.library_with_cmake.c 为例,将子工程 fibonacci 编译为动态链接库,子工程 factorial 编译为静态链接库 。 04.library_with_cmake.c 的内容为:

#include <stdio.h>
#include "factorial/factorial.h"
#include "fibonacci/fibonacci.h"
int main(){
  printf("Factorial(4): %d\n", Factorial(4));
  printf("Fibonacci(8): %d\n", Fibonacci(8));
  return 0;

        编译的具体过程如下:

                1)准备工作, 创建子工程 factorial 和 fibonacci。

                 2)为了将 factorial 编译为静态链接库,修改 factorial 目录下的 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.17)
project(factorial C)
set(CMAKE_C_STANDARD 11)
# 将 factorial.c 编译为静态链接库
add_library(factorial STATIC factorial.c)

                3)为了将 fibonacci 编译为动态链接库,修改 fibonacci 目录下的 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.17)
project(fibonacci C)   # 指定项目名
set(CMAKE_C_STANDARD 11)
# windows 系统下,编译动态链接库需要导入库。此处为设置导入库
if(WIN32)
    set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS 1)
endif (WIN32)
# 将 fibonacci.c 编译为动态链接库
add_library(fibonacci SHARED fibonacci.c)
# 动态链接库和可执行程序不在同一目录下时,可执行程序无法成功引用动态链接库
# install() 可将所有的动态链接库和可执行程序放置为同一目录下,便于程序的成功执行
install(TARGETS fibonacci
        RUNTIME DESTINATION bin          # Windows 系统下,设置动态链接库的路径为 bin
        LIBRARY DESTINATION lib          # Linux/Mac 系统下,设置动态链接库的路径为 lib
        ARCHIVE DESTINATION lib/static)  # 设置静态链接库的地址为 lib/static

                4)将主工程目录下的 CMakeLists.txt 修改为:

cmake_minimum_required(VERSION 3.17)
get_filename_component(ProjectId ${CMAKE_CURRENT_SOURCE_DIR} NAME)
string(REPLACE " " "_" ProjectId ${ProjectId})
project(${ProjectId} C)
set(CMAKE_C_STANDARD 11)
# 设置 install 路径,方便后续将动态链接库和可执行程序全部放置一起
set(CMAKE_INSTALL_PREFIX install)
# 设置不同平台下的动态链接库路径(Windows 系统无需其他配置)
if(APPLE)
    set(CMAKE_INSTALL_PREFIX @loader_path/../lib)  #  @loader_path 为可执行程序的路径
elseif(UNIX)
    set(CMAKE_INSTALL_PREFIX \$ORIGIN/../lib)  # \$ORIGIN 为可执行程序的路径
endif ()
# 添加相应的子工程,添加之后,会自动寻找子工程下的 CMakeLists.txt 文件,将子工程编译成设定好的链接库
add_subdirectory(factorial)
add_subdirectory(fibonacci)
include_directories("include")
file(GLOB files "${CMAKE_CURRENT_SOURCE_DIR}/*.c")
foreach(file ${files})
    get_filename_component(name ${file} NAME)
    add_executable(${name} ${file})
    target_link_libraries(${name} factorial fibonacci)  # 添加相应的链接库的名称(静态链接库和动态链接库都需要添加)
    install(TARGETS ${name} RUNTIME DESTINATION bin)  # 将可执行程序放置到 install/bin 目录下
endforeach()

                5)此时,若直接运行 04.library_with_cmake.c,程序执行结果会出错,如下图。原因在于执行程序的位置出错,此时执行程序的位置为 Chapter13\cmake-build-debug\04.library_with_cmake.c.exe,该目录下并没有 factorial 子工程的静态链接库 factorial.lib,也没有 fibonacci 子工程下的动态链接库 fibonacci.dll 和导入库 fibonacci.lib。

                 6)由于在 CMakeLists.txt 中使用 install() 将执行程序及链接库全部放置到 install 目录下,所以在运行程序前,需要先进行 install 的工作。从图中可以看出,执行程序及 fibonacci.dll 全部放入了 install/bin 目录下,静态链接库无显示,因为静态链接库与可执行程序一同编译了,导入库  fibonacci.lib 放入了 install/lib/static 目录下。

                 7)在命令行运行 install/bin 目录下的 04.library_with_cmake.c.exe,程序结果为:

在正常生产过程中,很少使用命令行编译和运行静态链接库和动态链接库,而是使用 CMake 完成静态链接库和动态链接库的编译。 以 04.library_with_cmake.c 为例,将子工程 fibonacci 编译为动态链接库,子工程 factorial 编译为静态链接库。 04.library_with_cmake.c 的内容为:#include &lt;stdio.h&gt;#include "factorial/factorial.h"#include ...
DCPU-16工具链 这是为DCPU-16虚拟CPU汇编,链接编译代码的一组工具。 由于最初使用该CPU的游戏早在2013年就被取消,因此不久之后这个项目就落幕了。 提供此存储是为了历史和教育目的。 不再维护此项目。 Windows使用说明 重要说明: GnuWin32不再起作用,因为它太过时了,无法支持预处理器系统中使用的可重入词法分析器和解析器。 如果使用了旧的说明,则现在必须卸载GnuWin32版本,从PATH中删除GnuWin32,然后按照以下说明进行操作。 您需要安装Cygwin。 您可以通过以下链接下载Cygwin: 确保在安装过程中选择安装期间的Flex和Bison软件包。 不要在Cygwin下安装CMake。 您应该将Cygwin安装到没有空格的路径中(它将通知您执行此操作)。 安装完成后,您必须将Cygwin bin /文件夹(位于安装Cygwin的位置
将第一项取消,第二项选上,点击 OK。 而后点击下一步,点击结束。 新工程完成后,随便新建一个语法正确的初始 .c 文件,然后 command+b “Build All”,根目录下出现Binaries目录,大功告成! 您可能感兴趣的文章:C++获取本机MAC,IP,MASK地址的方法如何利用Emacs来调试C++程序C++获得本机所有网卡的IP和MAC地址信息的实现方法详解C++的JSON静态链接Js 应该仅通过在代码中包含所需的文件来使用,如下所示: # include " memory.h " 有一些警告,某些标头可能需要系统特定的或依赖项(对此我无能为力),这是每个标头的要求列表: 内存在Windows上: Kernel32.lib 文件在Windows上: Kernel32.lib (因为它使用memory.h ) 确保在编译代码时链接这些,您可以使用CMake轻松完成此操作: if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows" ) target_link_libraries (your_exe Kernel32.lib) endif () 构建示例和测试 要构建提供的示例和测试,只需使用CMake! mkdir build && cmake ../ 1,3rdParty_VS2017_v141_x64_V11_full.7z; 2,cmake-3.12.0-rc1-win64-x64.zip; 3,ffmpeg-4.0-win64-dev.zip; 4,OpenSceneGraph-Data-3.4.0.zip; 5,OpenSceneGraph-OpenSceneGraph-3.6.3.zip; 6,编译完成的release版本。 要是没有C币,也可以去博客里下载!能理解找资源的痛苦,里面有百度链接 https://blog.csdn.net/q1015231295/article/details/106790529 我在学习OpenGL时收集的程序的简单回购。 到目前为止,所有程序都来自 。 您将需要一个至少支持C ++ 17的现代C ++编译器,还需要CMake的副本,其他所有内容都应包括在内。 为构建创建一个文件夹并在其中使用CMake,确保链接到它抱怨的所有,特别是GLFW,这是项目的主要依赖项。 编译器的使用方法因编译器而异。 这是一个Linux示例: cd opengl-study/ mkdir build cd build/ cmake ../ 完成后,每个编译的程序都应位于其自己的文件夹中。 类似于Shaders程序,该程序在构建后将位于名称为Shaders build/src/shader/ 。 分叉( ) 创建功能分支(git checkout -b功能) 提交更改(git commit -am set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) #指定C语言的标准 set(CMAKE_C_STANDARD 99) set(CMA
# specify the C++ standard set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True) 以上两句必须在add_executable前面 项目组织:开源项目内一般会存在多个不同的构建目标,类型有:可执行文件、动态、静态,这些项目各有自己的独立源文件目录 根目录下有一个 CMakeList.txt,里面定义了cmake版本需求、项目名、c++标准需求等,包含的构建目标公共部分都可以放在此处。 脚本示例: CMAKE_MINIMUM_REQUIRED(VERSION 3.15...
【规范+工具链】初始化,单元测试,示例编写,持续集成(CI自动化,拉代码后,可以全脚本化,不需要手动安装任何组件),增量编译,交叉编译, clang-tidy【lint工具+ vscode插件】已完成 CodeChecker ... xmake用于交叉编译 cmake深耕 感谢: : 命令组合: ldd <xx>查看链接关系 ,一大波可用的cmake工具链 git clone https://github.com/fallending/BinartLibs-Cpp.git cd BinartLibs-Cpp mkdir build // out-of-source 编译 cd build cmake .. cmake --build . 使用指南 # include " /path/to/BitBuffer.h " macro(use_cxx11) if (CMAKE_VERSION VERSION_LESS "3.1") if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11") endif () else () set (CM
首先,需要确保你的项目代码已经编写完成并且已经生成了动态链接(也称为共享或 DLL 文件)。然后,你可以按照以下步骤使用 CMake: 1. 在 CMakeLists.txt 文件中添加以下指令来定义你的文件: add_library(mylib SHARED mylib.cpp) 其中,mylib 是你的文件的名字,SHARED 表示生成动态链接。 2. 在你的项目中,通过 find_library 指令来查找该文件。比如: find_library(MYLIB mylib PATHS /path/to/mylib/directory) 其中,MYLIB 是你自定义的变量名,mylib 是文件名,PATHS 指定文件的路径。 3. 将找到的文件链接到你的可执行文件中: target_link_libraries(myexe ${MYLIB}) 其中,myexe 是你的可执行文件名字。 4. 运行 CMake 生成 Makefile 或其他构建工具的文件。 5. 编译你的项目,此时文件会被动态链接到你的可执行文件中。 注意:在 Windows 系统上,动态链接的后缀名为 .dll,在 Linux 和 macOS 系统上,动态链接的后缀名为 .so。因此在使用 find_library 指令时需要注意不同系统下的后缀名。