项目目录
各个文件
myhell.h
//
// Created by glt on 2024/7/3.
//
#ifndef MY_PRO_HELLO_H
#define MY_PRO_HELLO_H
#include <iostream>
void HelloFunc();
#endif //MY_PRO_HELLO_H
hello.cpp
//
// Created by glt on 2024/7/3.
//
#include "myhello.h"
void HelloFunc(){
std::cout << "Hello My Linux !" << std::endl;
}
forhello.cpp
//
// Created by glt on 2024/7/3.
//
#include "myhello.h"
int main()
{
HelloFunc();
return 0;
}
CmakeList.txt
cmake_minimum_required(VERSION 3.20)
project(my_pro)
set(CMAKE_CXX_STANDARD 17)
# 添加头文件目录
INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/myinclude")
# 设置目标链接库文件的存放位置
SET(LIBRARY_OUTPUT_PATH "${PROJECT_BINARY_DIR}/mylib")
# 生成动态库
#ADD_LIBRARY(hello_share SHARED mysrc/hello.cpp)
# 生成静态库
#ADD_LIBRARY(hello_static STATIC mysrc/hello.cpp)
#生成可执行文件
add_executable(ForHello_local_static test/ForHello.cpp)
add_executable(ForHello_local_share test/ForHello.cpp)
#链接库到对应的库
target_link_libraries(ForHello_local_static hello_static)
target_link_libraries(ForHello_local_share hello_share)
解释
上面的代码里,我同时生产了静态库与动态库
执行
下面两个命令
/usr/bin/cmake -DCMAKE_BUILD_TYPE=Release -G “CodeBlocks - Unix Makefiles” -S /home/opc/windows_project/my_pro -B /home/opc/windows_project/my_pro/cmake-build-release
/usr/bin/cmake --build /home/opc/windows_project/my_pro/cmake-build-release
(忽略我上面构建的其他的target)
之后 我们可以看到两个可执行文件:ForHello_local_static 和ForHello_local_share
执行两个文件,没有问题。
然后我们试着把cmake-build-release下面的mylib改成mylib2,再执行,就会发现:
为什么呢?ForHello_local_static 已经把库加到自己里面了,外面的库有什么变化,对ForHello_local_static 本身已经没有影响了。
但是ForHello_local_share 还动态依赖原来的库,你把目录名称改了,ForHello_local_share 想要去找hello_share这个动态库自然找不到了。
假定库不是我们的项目产生的,而是别人给的呢?
假定别人给的库就在源码目录下的srclib下面。
那试试如下代码
add_executable(ForHello_other test/ForHello.cpp)
target_link_libraries(ForHello_other ${PROJECT_SOURCE_DIR}/srclib/libhello_share.so)
第三个二进制文件就产生了:ForHello_other
参考资料
https://blog.csdn.net/hp_cpp/article/details/110404651