Mac系统制作C++动态链接库

本文介绍了如何在Mac系统中使用C++创建和调用动态链接库,包括myFunc库的声明、定义、编译步骤,以及注意事项,如动态库命名规则和头文件搜索路径设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mac系统制作C++动态链接库


最近在学习使用C++语言学习一些关于多线程的知识,需要将一些多线程使用的函数单独用一个动态库进行封装起来调用,查了一些网上的资料,各种各样的办法,尝试了几种方式,总是会遇到一些报错。后面根据自己的理解,偶然成功了,再次进行记录一下当时的一些操作过程。

以下是我需要使用的一些文件:myFunc.h,myFunc.cpp,Thread_Ex4.cpp

// myFunc.h 申明了一些函数,以及申明定义量测使用的模板函数
#ifndef __MYFUNC_H_
#define __MYFUNC_H_ 

#include <iostream>
#include <thread>

using namespace std::chrono;
using namespace std;

template<typename T>
void measure(T&& func)
{
    auto beg_t = system_clock::now();
    func();
    auto end_t = system_clock::now();
    duration<double> diff = end_t - beg_t;
    cout<<"performTest total time:"<<diff.count()<<endl;
}

// user-defined function
void func();

#endif // !__MYFUNC_H_
// myFunc.cpp:自定义函数的定义
#include "myFunc.h"

void func()
{
    cout<<"This is func thread "<<endl;

    int s = 0;
    for(int i =0;i < 5;i++)
        s+= i;
}

// main 入口
// Thread_Ex4.cpp
#include "myFunc.h"
#include <iostream>

int main(void)
{
    measure(func);
}

在这里,首先对myFunc.cpp进行编译g++ -g -shared myFunc.cpp -o libmyFunc.dylib -std=c++11
这里特别需要注意的是Mac系统下动态库的命名:lib[libname].dylib
接下来就可以调用这个动态库:g++ -g Thread_Ex4.cpp -o Thread_Ex4 -I . -L . -l myFunc -std=c++11

说明

 1. -l(小写L)后接xxxx 表示调用libxxxx.dylib 库 
 2. 如果库不在系统默认的目录下要使用-L后接路径 再接-lxxxxx
 3.  -I(大写i)后接路径,表示在此路径下寻找头文件 xxxx.h

完结。

### C++ QT5.14.2 动态库文件的使用、创建与链接 #### 创建动态库 在QT环境中创建动态库涉及编写源代码并将这些代码编译成共享对象(即.so文件于Linux/MacOS下,或.dll文件于Windows)。对于C++项目而言,在Qt Creator中新建一个Library类型的工程即可开始构建动态库。 为了确保兼容性和便于管理依赖关系,建议遵循官方文档指导下的最佳实践来设置pro文件中的变量。例如: ```qmake TEMPLATE = lib CONFIG += shared TARGET = mylib DESTDIR = $$PWD/lib/ ``` 上述配置指定了目标产物为名为`mylib`的共享库,并将其放置在一个特定目录内[^1]。 #### 使用动态库 当完成动态库制作之后,可以在其他应用程序里通过包含头文件以及指定链接选项的方式来调用其中定义的功能函数。假设已经有一个位于`/path/to/mylib.h`处的接口声明,则客户端程序应当在其`.pro`文件加入如下指令以便正确引入外部资源: ```qmake INCLUDEPATH += /path/to/include LIBS += -L/path/to/lib -lmylib ``` 这里`-L`参数用于告知链接器去哪里寻找实际二进制形式的库;而`-l`则用来说明希望加载的具体库名前缀去掉字母'l'后的部分。 针对不同操作系统平台上的细节差异,比如Windows环境下可能还需要额外处理DLL导入导出宏等问题,请参阅相关资料获取更详尽的操作指南[^2]。 #### 链接MySQL驱动作为实例展示 以集成第三方SQL数据库访问能力为例,如果打算让基于Qt的应用支持MySql查询功能的话,那么除了下载对应版本的服务端组件之外,还需按照指示把必要的运行时支撑件复制至适当位置,像这样: 将`qsqlmysql.dll`和`qsqlmysqld.dll`这两个文件放到`Qt5.14.2\5.14.2\msvc2017\plugins\sqldrivers`路径下面去。 另外值得注意的是,某些情况下或许会遇到因缺少必要环境变量而导致无法正常工作的状况。此时可以通过编辑shell profile脚本的方式向系统注册新的搜索路径,从而解决问题。例如,在macOS上可以这样做: 打开终端执行命令`open ~/.bash_profile`或者利用文本编辑工具直接修改该隐藏文件的内容,追加几行设定语句如下所示: ```bash export QTDIR=/Users/mac/Qt5.14.2/5.14.2/clang_64 export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH export PATH=$QTDIR/bin:$PATH ``` 这一步骤的作用在于使当前用户的登录session能够识别新安装软件包的位置信息,进而顺利实现模块间的交互协作[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值