首页 > 系统相关 >linux下gcc/g++创建一个共享库项目以及创建一个可执行项目动态链接该共享库

linux下gcc/g++创建一个共享库项目以及创建一个可执行项目动态链接该共享库

时间:2023-08-19 10:11:46浏览次数:186  
标签:gcc ++ 创建 so cpp 共享 main 目录 libtest

1.先确保有g++命令

2.创建一个c++项目目录,并cd到该目录

3.创建共享库头文件:dynamic_so.h

#ifndef __TEST__
#define __TEST__

int testFun(int a, int b);

#endif

4.创建对应共享库的实现文件:dynamic_so.cpp

#include "dynamic_so.h"

int testFun(int a, int b)
{
    return a + b;
}

5.编译共享库:g++ dynamic_so.cpp -fPIC -shared -o libtest.so
此时可以看到在项目根目录下多了一个叫libtest.so的文件,这里注意,共享库要以lib开头.so结尾;

 

6.开始写主程序:main.cpp

#include <iostream>
#include "dynamic_so.h"

using namespace std;

int main()
{
    cout << testFun(10, 20) << endl;

    return 0;
}

可以看到这个程序也引用了这个头文件,用于后面代码编写不会报错

7.编译成可执行文件main:g++ main.cpp -L. -ltest -o main【这里的-ltest的test就是上面的共享库去掉前缀lib和后缀.so的名字,最后的main就是可执行文件名】
可以看到在项目根目录下也多出了一个main文件

8.执行main文件:./main会发现找不到动态链接库,我们用ldd main会发现libtest.so链接的是not found

解决方式为将libtest.so放到公共目录,比如/usr/lib目录下,这个时候再用ldd main就可以看到libtest.so是链接的/usr/lib/libtest.so了

此时再执行就会输出30;

 

9.如果想编译时就让main可以从程序所在目录(而非工作目录)里搜索libtest.so呢?可以这么编译:g++ main.cpp -L. -Wl,-z,origin -Wl,-rpath='$ORIGIN' -ltest -o main
此时ldd main可以看到libtest.so链接的就是main文件当前所在目录的libtest.so文件;(libtest.so => /home/silentdoer/Projects/CppProjs/cpp_test/./libtest.so)

还可以切换到上一层用./cpp_test/main来执行一下,发现确实可以输出30

10.如果是希望libtest.so链接的是main文件同级目录下的lib目录里的libtest.so文件呢?可以这样写:g++ main.cpp -L. -Wl,-z,origin -Wl,-rpath='$ORIGIN/lib' -ltest -o main

这种情况下,编译要求libtest.so在main.cpp所在目录,但是执行main时要求libtest.so在main所在目录的lib目录下;

标签:gcc,++,创建,so,cpp,共享,main,目录,libtest
From: https://www.cnblogs.com/silentdoer/p/17642109.html

相关文章

  • webman:安装/创建项目(v1.5.7)
    一,官方文档:1,官方站:https://www.workerman.net/webman2,安装文档:https://www.workerman.net/doc/webman/install.html二,准备安装环境:1,需求环境需求PHP>=7.2Composer >=2.02,查看本地环境:php:liuhongdi@lhdpc:~$/usr/local/soft/php8/bin/php--version......
  • 创建一个简单的命令
    创建一个简单的命令设计命令首先,你应该已经为这个命令想好了名字。在这个片段中,我们将使用/kit这个命令的例子。然而,这可以用你在自己的插件中选择使用的任何命令来代替。建议为每个命令创建一个新的类,这样更有条理。你的类必须实现CommandExecutor接口。该类文件可能看起......
  • 【Oracle RAC Database】创建ASM磁盘组与RAC Database
    [grid@node01~]$asmca[oracle@node01~]$dbca[grid@node01~]$crsctlstatusres-t--------------------------------------------------------------------------------NAMETARGETSTATESERVERSTATE_DETAILS---------......
  • 利用 AI 视频模板创建器彻底改变内容创建:数字时代的游戏规则改变者
    介绍在不断发展的数字环境中,内容创建已成为企业、营销人员和个人的关键方面。随着注意力的缩短和对视觉吸引力内容需求的增加,对高效和有效的内容创建工具的需求激增。人工智能(AI)已成为一项突破性技术,它彻底改变了内容创作,尤其是随着人工智能视频模板创作者的出现。在这篇博文中......
  • C# 特性的创建与使用
    1、先创建一些特性以及一个示例类//应用的目标类型:类,属性,或者其他,是否对同一个目标进行多次应用[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method,AllowMultiple=false)]classDoseInterstingThingAttribute:Attribute{publici......
  • .net7 创建windows后台服务
    开发语言:C#运行时:.net7开发环境:visualstudio2022微软官方文档:https://learn.microsoft.com/zh-cn/dotnet/core/extensions/windows-service?pivots=dotnet-7-0最近公司需要使用后台调度服务定时拉取业务数据并推送至第三方,原本是直接使用aps.netcore应用程序部署在IIS上......
  • 【Oracle RAC Database】通过ASMLIB创建ASM DISK
    [root@node01~]#groupadd-g1200dba[root@node01~]#groupadd-g1201oinstall[root@node01~]#groupadd-g1202asmadmin[root@node01~]#groupadd-g1203asmdba[root@node01~]#useradd-u1100-goinstall-Gasmadmin,asmdba,dbagrid[root@node01~]......
  • 7种创建方式,带你理解Java的单例模式
    本文分享自华为云社区《《Java极简设计模式》第01章:单例模式(Singleton)》,作者:冰河。单例设计模式看几个单例对象的示例代码,其中有些代码是线程安全的,有些则不是线程安全的,需要大家细细品味,这些代码也是在高并发环境下测试验证过的。代码一:SingletonExample1这个类是懒汉模式......
  • Prototype 原型模式简介与 C# 示例【创建型4】【设计模式来了_4】
    〇、简介1、什么是原型模式?一句话解释:  针对比较耗时的对象创建过程,通过原型的Clone方法来克隆对象,而非重新创建。原型设计模式(PrototypeDesignPattern)是一种创建型设计模式,其主要目的是通过复制已有对象来创建新的对象,而无需通过实例化类并初始化其属性。这种模式在需......
  • c# - 如何在圆角 WPF 窗体中创建圆角矩形?
    我正在WPF中创建一个应用程序,我想要圆角。收到。现在窗体是无边框的,我正在尝试创建一个圆角矩形并将其放在顶部,使其看起来像Windows应用程序的顶部栏。我做不到。这是我的代码:<BorderCornerRadius="50,0,50,0"BorderBrush="Black"BorderThickness="2"Background="......