-lpthread 和 pthread 以及 链接库的顺序

发布时间 2023-10-20 10:07:56作者: HDD-SG

写cmake文件时,编译一直无法正确识别欲调用的库函数,明明-lmysqlclient已经加上了。
原本内容:(至今仍未解决,恳请各位点拨一下)

cmake_minimum_required(VERSION 3.0)

project(HLWebServer)

# 设置C++标准为 C++11
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -lmysqlclient -Wall -O2 -std=c++11")

set(CMAKE_BUILD_TYPE "Release")

# 添加头文件目录
include_directories(${CMAKE_SOURCE_DIR}/include)

# 指定源代码文件,这里可能需要修改
set(SRC 
    ${CMAKE_SOURCE_DIR}/src/http_conn.cpp
    ${CMAKE_SOURCE_DIR}/src/log.cpp
    ${CMAKE_SOURCE_DIR}/src/sql_connection_pool.cpp
)

# 生成可执行文件
add_executable(HLWebServer ${SRC} main.cpp)

修改为:

# 设置CMake最低版本要求
cmake_minimum_required(VERSION 3.0)

# 设置项目名称
project(HLWebServer)

# 设置C++标准
set(CMAKE_CXX_STANDARD 11)

# 添加可执行文件
add_executable(HLWebServer main.cpp ./include/threadpool.h ./src/http_conn.cpp ./include/http_conn.h ./include/locker.h ./src/log.cpp ./include/log.h ./include/log_block_queue.h ./src/sql_connection_pool.cpp ./include/sql_connection_pool.h)

# 链接库
target_link_libraries(HLWebServer pthread -lmysqlclient)

  • 疑问1:为什么target_link_libraries(HLWebServer pthread -lmysqlclient)为什么 -lmysqlclient前面需要加l,而pthread不用

1、-lpthread是较为老式的解决方法,pthread新加了对于宏D_REENTRANT的定义,-pthread会被展开为“-D_REENTRANT -lpthread”,它不仅可以链接pthread库,还可以打开系统头文件中的各种多线程支持分支,比如,我们常常使用的错误码标志errno,如果没有定义_REENTRANT,则实现为一个全局变量;若是定义了_REENTRANT,则会实现为每线程独有,从而避免线程竞争错误。
2、-pthread可移植性较强:在Linux中,pthread是作为一个单独的库存在的(libpthread.so),但是在其他Unix变种中却不一定,比如在FreeBSD中是没有单独的pthread库的,因此在FreeBSD中不能使用-lpthread来链接pthread,而使用-pthread则不会存在这个问题,因为FreeBSD的编译器能正确将-pthread展开为该系统下的依赖参数。同样道理,其他不同的变种也会有这样那样的区别,如果使用-lpthread,则可能在移植到其他Unix变种中时会出现问题,为了保持较高的可移植性,我们最好还是使用-pthread(尽管这种做法未被接纳成为C标准,但已基本是事实标准)。

参考:gcc编译选项-lpthread和-pthread的区别

  • gcc库的链接顺序和依赖问题

感觉这确实是一个问题但是应该不是影响我正确性的原因吧?不懂

参考:折腾gcc/g++链接时.o文件及库的顺序问题