首页 > 其他分享 >-lpthread 和 pthread 以及 链接库的顺序

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

时间:2023-10-20 10:11:34浏览次数:27  
标签:CMAKE 链接库 lpthread pthread cpp HLWebServer include

写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文件及库的顺序问题

标签:CMAKE,链接库,lpthread,pthread,cpp,HLWebServer,include
From: https://www.cnblogs.com/H-force/p/17776393.html

相关文章

  • 下载的PC游戏启动后报错:无法加载 DLL“steam_api64”: 动态链接库(DLL)初始化例程失败
    无法加载DLL“steam_api64”:动态链接库(DLL)初始化例程失败。(异常来自HRESU解决方式:将文件夹拷贝到Steam-->steamapps文件夹下面还好是忍者神龟抛了个异常,才找到了问题所在,论抛异常的重要性!!!忍者神龟如龙......
  • C++ - VS2019配置pthread线程库
    1.说明在VS里用MS编译器不能直接调用pthread库,需要先自行下载该库:http://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zip解压后用的到的只有Pre-built.2文件夹下的文件。 2.配置如下图分别配置三大项:包含目录-->...pthreads-w32-2-9-1-release\Pre-......
  • pthread实现多线程矩阵乘法
    #include<pthread.h>#include<stdio.h>#include<windows.h>#include<iostream>usingnamespacestd;#pragmacomment(lib,"pthreadVC2.lib")#definerowCount1300#definemediumCount1500#definecolumnCount5000#definen_threa......
  • Modbus动态链接库供多语言使用 | Go
    Modbus协议控制动态链接库应用场景基于各门语言都有各自的modbus协议库,且良莠不齐,而且在具体的框架下可能存在版本依赖问题,而且对modbus协议存在比较多的细节处理,可以查看modbusslave、或者modbuspoll中相关的配置可知,数据类型对应读写寄存器个数、大小端的处理等等细节,所以......
  • 如何查找链接库的位置,编译和执行时分别?
    GCC动态链接库链接查找https://www.cprogramming.com/tutorial/shared-libraries-linux-gcc.htmlItlooksintheDT_RPATHsectionoftheexecutable,unlessthereisaDT_RUNPATHsection.ItlooksinLD_LIBRARY_PATH.Thisisskippediftheexecutableissetuid/se......
  • win10操作系统动态链接库DLL文件搜索路径
    搜索可执行文件(xx.exe)同级目录下的其它DLL文件(不会搜索子文件夹)32位程序C:\Windows\System32操作系统当前用户或者系统用户Path环境变量中直接包含的文件夹(子文件夹中的DLL同样无法被搜索到,不是递归搜索)在终端执行D:\code>C:\Users\XXX\Desktop\新建文件夹\bb.......
  • java中使用JNA调用C/C++动态链接库中的函数
    目录C++部分创建动态库项目JAVA部分pom依赖工程结构测试类jna提供C与JAVA数据类型映射参考C++部分创建动态库项目注意:动态库中的头文件,必须要将需要导出的函数包裹在extern"C"{}中,否者在使用侧java工程中,就无法加载并使用JAVA部分pom依赖<dependencies><dependenc......
  • 使用GNU编译器套件链接库
    1、当前目录/home/xuanmiao/Demo/LSPT/Test创建文件prime.h和prime.cprime.hintisprime(longintnumber);prime.cintisprime(longintnumber){longintj;intprime=1;/*Testifthenumberisdivisible,starting*from2*/for(j=2;......
  • 【muduo】net篇---EventLoopThread和EventLoopThreadPool
    EventLoopThread是事件循环线程,包含一个Thread对象,一个EventLoop对象。在构造函数中,把EventLoopThread::threadFunc注册到Thread对象中(线程启动时会回调)。EventLoopThreadPool是事件循环线程池,管理所有客户端连接,每个线程都有唯一一个事件循环。可以调用setThreadNum设置线程的数......
  • 动态链接库/共享库的作用
    1.最大的作用是用于减少磁盘占用;2.内存占用基本没有减少,主要是因为每个程序都会单独的加载相同的共享库,而不会在内存里共用一个共享库,主要是因为防止共享库是有状态的;但是也有例外,比如共享库里的只读部分是可以共享的,比如共享库的元数据/常量之类的。3.还有一个功能就是插件化,......