makefile如何调用静态库的方法实现

makefile如何调用静态库

1、在windows下 g++环境中,调用一个python的静态链接库,在makefile文件有一段是全局的g++命令:

$(PROG): $(OBJS)
 $(CXX) $(LFLAGS) $^ -o $@

现在我要链接上一个python的静态库,lib存储在makefile同目录下libs文件夹下:

$(PROG): $(OBJS)
 $(CXX) $(LFLAGS) $^ -o $@ ./libs/libpython37.a

2、在Linux Ubuntu 18.04版本中添加静态库,视python版本而定:

$(PROG): $(OBJS)
 $(CXX) $(LFLAGS) $^ -o $@ -lpython3.6m

Makefile 如何调用opencv 的静态库

main.cpp

#include <stdio.h>
#include "opencv2/opencv.hpp"

int main()
{

  cv::Mat image = cv::imread("./testPic/jianhui.jpg");

  //cv::imshow("xxx", image);

  //cv::waitKey(40);

  printf("image.col=%d image.row=%d \n", image.cols, image.rows);

  cv::imwrite("aa.jpg", image);

  return 0;
}

Makefile

EXE=main

#SUBDIR=src object
#CXXFLAGS:编译选项, LDFLAGS:链接选项
thirdparty_root := /local_install/static
CC := g++

#export PKG_CONFIG_PATH := ${thirdparty_root}/lib/pkgconfig:${PKG_CONFIG_PATH}
#INCS += `pkg-config --cflags opencv`
#LIBS += `pkg-config --libs opencv`

INCS := -I${thirdparty_root}/include

LIBS += -L${thirdparty_root}/lib -lopencv_imgcodecs -lopencv_dnn -lopencv_imgproc -lopencv_core
#LIBS += -L${thirdparty_root}/lib -lopencv_imgcodecs -lopencv_imgproc -lopencv_core # 亲们,顺序不能变,因为这个快把我整崩溃了
LIBS += -L${thirdparty_root}/share/OpenCV/3rdparty/lib -lIlmImf -llibjasper -llibjpeg -llibpng -llibtiff -llibwebp -lzlib -lippicv -ldl

CXXFLAGS := -Wall -c -O2 -std=c++11 $(INCS)
LDFLAGS := $(LIBS)
LDFLAGS += -lpthread
#LDFLAGS += -Wl,-rpath,${thirdparty_root}/share/OpenCV/3rdparty/lib:${thirdparty_root}/lib: # 动态库的时候需要寻找的路径

#CXX_SOURCES =$(foreach dir,$(SUBDIR), $(wildcard $(dir)/*.cpp))
#CXX_OBJECTS=$(patsubst %.cpp, %.o, $(CXX_SOURCES))

CXX_OBJECTS := $(patsubst %.cpp,%.o,$(shell find . -name "*.cpp"))
DEP_FILES =$(patsubst %.o, %.d, $(CXX_OBJECTS))

$(EXE): $(CXX_OBJECTS)
 $(CC) $(CXX_OBJECTS) -o $(EXE) $(LDFLAGS)

%.o: %.cpp
 $(CC) -c $(CXXFLAGS) -MMD $< -o $@

-include $(DEP_FILES)

clean:
 rm -rf $(CXX_OBJECTS) $(DEP_FILES) $(EXE)

test:
 echo $(CXX_OBJECTS)

上面的Makefile 是用调用动态库的方式来调用静态库,如果同时存在静态库和动态库,会优先调用动态库

EXE=CppWebServer

#SUBDIR=src object
#CXXFLAGS:编译选项, LDFLAGS:链接选项
CC := g++
thirdparty_root := /local_install/static

#INCS += `pkg-config --cflags opencv`
INCS += -I/usr/lib/jdk1.8.0_191/include
INCS += -I/usr/lib/jdk1.8.0_191/include/linux/

INCS += -I./include

INCS := -I${thirdparty_root}/include

# 这种方式调用静态库,保证在在动态库也存在的时候也能调用到静态库
LIBS += ${thirdparty_root}/lib/libopencv_imgcodecs.a
LIBS += ${thirdparty_root}/lib/libopencv_dnn.a
LIBS += ${thirdparty_root}/lib/libopencv_imgproc.a
LIBS += ${thirdparty_root}/lib/libopencv_core.a
LIBS += ${thirdparty_root}/share/OpenCV/3rdparty/lib/libIlmImf.a
LIBS += ${thirdparty_root}/share/OpenCV/3rdparty/lib/liblibjasper.a
LIBS += ${thirdparty_root}/share/OpenCV/3rdparty/lib/liblibjasper.a
LIBS += ${thirdparty_root}/share/OpenCV/3rdparty/lib/liblibjpeg.a
LIBS += ${thirdparty_root}/share/OpenCV/3rdparty/lib/liblibpng.a
LIBS += ${thirdparty_root}/share/OpenCV/3rdparty/lib/liblibtiff.a
LIBS += ${thirdparty_root}/share/OpenCV/3rdparty/lib/liblibwebp.a
LIBS += ${thirdparty_root}/share/OpenCV/3rdparty/lib/libzlib.a
LIBS += ${thirdparty_root}/share/OpenCV/3rdparty/lib/libippicv.a

LIBS += -L./lib -lTHFaceImage -lTHFeature
LIBS += -ldl
#LIBS += `pkg-config --libs opencv`

CXXFLAGS := -Wall -c -O2 -std=c++11 $(INCS)
LDFLAGS := $(LIBS)
LDFLAGS += -lpthread

#CXXFLAGS += -I/usr/local/include/
#LDFLAGS += -L/usr/local/lib -lopencv_world

#CXX_SOURCES =$(foreach dir,$(SUBDIR), $(wildcard $(dir)/*.cpp))
#CXX_OBJECTS=$(patsubst %.cpp, %.o, $(CXX_SOURCES))

CXX_OBJECTS := $(patsubst %.cpp,%.o,$(shell find . -name "*.cpp"))
CXX_OBJECTS += $(patsubst %.c,%.o,$(shell find . -name "*.c"))

DEP_FILES =$(patsubst %.o, %.d, $(CXX_OBJECTS))

$(EXE): $(CXX_OBJECTS)
 $(CC) $(CXX_OBJECTS) -o $(EXE) $(LDFLAGS)

%.o: %.cpp
 $(CC) -c $(CXXFLAGS) -MMD $< -o $@

-include $(DEP_FILES)

clean:
 rm -rf $(CXX_OBJECTS) $(DEP_FILES) $(EXE) 

OBJ_DIR = obj
move:
 if [ ! -d $(OBJ_DIR) ]; then mkdir -p $(OBJ_DIR); fi;\
 mv $(CXX_OBJECTS) $(OBJ_DIR); \
 mv $(DEP_FILES) $(OBJ_DIR); \
 mv $(EXE) $(OBJ_DIR)

test:
 echo $(CXX_OBJECTS)

到此这篇关于makefile如何调用静态库的方法实现的文章就介绍到这了,更多相关makefile调用静态库内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 使用autoconf生成Makefile并编译工程的步骤

    前言 在Linux下,编译和链接需要用Makefile,而写好一个Makefile可不容易,写出一个规范的Makefile更是麻烦.我们可以利用autoconf来生成一个Makefile,尤其在大型工程里,能省去很多麻烦. 这里我会用一个工程来说明怎么做,有一些步骤不是必须的,但是如果你看不出来哪些步骤不是必须的,最好跟着一步步走,因为某些步骤省略了,代码也需要做出相应修改(如修改路径等). 步骤 首先安装autoconf sudo apt-get install autoconf 新建一个项目

  • C++关于Makefile的详解含通用模板

    介绍 Makefile是一个规定了怎么去编译和链接程序的脚本文件,在执行make命令时会执行该文件,window环境下的IDE,如visual studio已经集成了该功能,不需要关心程序的编译规则,在linux下做C/C++开发时经常用到,说到这里首先要知道一个工具make. make是一个解释Makefile中指令的命令工具,常见的IDE都集成了这个工具.目前centos 7.3 GNU的make版本是3.82 规则 目标文件:依赖文件 [Tab]系统指令1     (注意:系统指令前必须有

  • linux中无make命令的问题(make: *** 没有指明目标并且找不到 makefile及make命令安装方法)

    注意!!! 这种情况其实可以在安装虚拟机过程中进行避免得,下次测试装虚拟机的时候直接选择开发工具就可以了 好啦言归正传,这次是帮助大家解决问题得,首先输入make会有下图的显示 这种情况下如果是有网环境直接输入yum -y install make 就可以解决,若是无网环境则需要上网上下载源码包进行上传 yum -y install make 无网环境下在下面这个网址进行下载,在通过xftp上传到linux系统中 http://ftp.gnu.org/gnu/make/make-4.2.tar.

  • Linux下Makefile的automake生成全攻略

    文/余涛 作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的Makefile就不那么容易了. 在本文中,将给大家介绍如何使用autoconf和automake两个工具来帮助我们自动地生成符合自由软件惯例的Makefile,这样就可以象常见的GNU程序一样,只要使用"./configure","make","ma

  • Makefile/cmake/node-gyp中区分判断不同平台的方法

    最近用QTK开发一个下载(下载到开发板)工具,同时用到了Makefile/cmake和node-gyp,而且都要针对不同平台做不同的处理.这里做个记录,以备以后有需要时查阅. Makefile 在Makefile中,可以用OS变量判断当前系统是否是Windows,然后用uname来判断当前系统是MacOS还是其它系统. ifeq ($(OS),Windows_NT) PLATFORM="Windows" else ifeq ($(shell uname),Darwin) PLATFOR

  • C语言 makefile学习及实现实例

    C语言 makefile学习及实现实例 俗话说,不会写makefile的程序员不是好的程序员. 看了很多人写的makefile教程,感觉太难懂,还不如韦东山老师视频里讲的好理解. 先记下这几个符号,以后看到就不会忘记这是什么东西了. 先来看一个例子: <span style="font-size:18px;">Person: main.o person.o g++ -o $@ $^ %.o : %.cpp g++ -c -o $@ $< clean: rm -rf *

  • Linux Makefile与Shell的问题

    大概只要知道Makefile的人,都知道Makefile可以调用Shell脚本.但是在实际使用时,并不那么简单,一些模棱两可的地方可能会让你抓狂.你若不信,可以先看几个例子,想象一下这些这些例子会打印什么内容,记下你想象的结果,然后在计算机上运行这些例子,对照看一下.   示例一: 复制代码 代码如下: if [ "$(BUILD)" = "debug" ]; then  echo "build debug"; else echo "b

  • makefile如何调用静态库的方法实现

    makefile如何调用静态库 1.在windows下 g++环境中,调用一个python的静态链接库,在makefile文件有一段是全局的g++命令: $(PROG): $(OBJS) $(CXX) $(LFLAGS) $^ -o $@ 现在我要链接上一个python的静态库,lib存储在makefile同目录下libs文件夹下: $(PROG): $(OBJS) $(CXX) $(LFLAGS) $^ -o $@ ./libs/libpython37.a 2.在Linux Ubuntu 18

  • 动态库调用静态库示例讲解

    生成动态库: 需要的目标文件得用-fPIC选项生成. 而静态库所需的目标文件可以不用-fPIC选项. 例: 复制代码 代码如下: /////// static.h void static_print(); ///////static.cpp #include <iostream> #include "static.h" void static_print() { std::cout<<"This is static_print function&quo

  • Python调用.NET库的方法步骤

    开发背景是这样的:整个项目中使用很多台摩托罗拉的RFID读卡器,我要为这些读卡器写一个管理程序,判断是否有RFID标签进入或离开某个区域.用户提供给我的,除了设备,就是一个.net的动态库文件. 经朋友指点,安装了.NET Framework 4.0和IronPython 2.7之后,终于可以调用.net库了.我不确定的是,python环境下那些打包工具是否还是使用,因为脚本要在IronPython的解释器ipy.exe中运行--这是后话,需要在以后的应用中去实践.先说说实际应用中的稀奇古怪的问

  • c/c++静态库之间相互调用的实战案例

    目录 一.c++项目如何调用c的库(以静态库为例) 1.将栈的源文件和头文件拷贝一份到Stack_c.lib这个项目的路径下 2.打包成静态库 3.建立一个c++项目(TestStacklib) 引入c项目中的头文件 4.设置附加库和附属关系 二.c项目如何调用c++的库(静态库为例) 1.建立c++项目(Stack_cpp) 并且将栈的源文件和头文件包含在该目录 将其打包为cpp的静态库 2.建立c项目 3.包含静态库的头文件 4 .添加打包的cpp动态库到附加库目录 设置依赖项 总结 本文主

  • xcode 4 制作静态库图文详解

    最近在做Apple的IOS开发,有开发静态库的需求,本身IOS的开发,只允许静态库或者Framework.在Xcode上没有找到允许编译,如同Android上的*.so和Win32上的dll这样的说法.不过Framework这样的框架,估计也是类似动态库的实现,不过没有具体研究过,后续继续深入研究. 我这个文档的静态库的开发是基于Xcode4.2和iOS SDK5.0编写的.Xcode4跟之前的Xcode3还是有不少的差别的.下面就简单写一个静态库和一个调用静态库的例子.静态库的编写:1.静态库

  • iOS创建与使用静态库

    在日常项目开发中,不论是为了两个公司项目上的业务交流还是为了减少项目的编译时间,有的时候我们会把项目中的私密内容打包成静态库,或者是把项目中变动较少一部分打包成静态库以便提高编译效率,那么下面我们就来学习一下"iOS-静态库的创建与使用": (一)iOS静态库.动态库与Framework静态库与动态库的区别 (1)什么是库? 库(Library)直白一点说就是一段编译好的二进制代码,加上头文件就可以供别人使用;(例如: iOS中Objective-C编译下的.h和.m文件,打包静态库后

  • xcode 详解创建静态库和动态库的方法

    xcode 创建静态库和动态库 1.linux中静态库和动态库区别: 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 静态库:这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了.当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译. 动态库:这类库的名字一般是lib

  • GCC 编译使用动态链接库和静态链接库的方法

    1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有别于静态库,动态库的链接是在程序执行的时候被链接的.所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用.(TODO:链接动态库时链接阶段到底做了什么) 2 静态库和动态库的比较 链接静态库其实从某种意义上来说也是一种粘贴复制,只不过它操作的对象是目标代码而不是源码而已.因为静态库被链接后库

  • go开发中引用静态库.a文件的方法

    前言 我使用goland开发,下面都是用goland做演示 一.生成demo.a 新建一个项目,目录如下 demo.go package demo import ( "fmt" ) func Demo() { fmt.Printf("hello world") } main.go package main import "demo" func main() { demo.Demo() } 配置Run/Debug Configurations,在G

  • 关于使用rust调用c++静态库并编译nodejs包的问题

    目录 一.创建项目 二.Cargo.toml 三.package.json 四.代码分析 在项目上经常要用到身份证阅读器.护照阅读仪.指纹仪等各种品牌硬件,假如每套系统的都做集成开发那代码的维护成本将变得很高,为此采用rust来调用厂家提供的sdk c++开发包并封装成nodejs包,用fastify来开发成web api独立的服务形式.这样我们开发系统时只需调用web接口即可,跨平台又可共用,方便快捷,话不多说来看代码如何实现. 一.创建项目 安装rust后,打开vs新建一个工程目录,我们通过

随机推荐