Configrations
~/.bashrc
:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/username/local/opencv-3.4.7/lib
Compile
demo
#include <opencv2/opencv.hpp>
#include <iostream>
// using namespace cv;
int main()
{
cv::Mat img=cv::imread("man.jpg");
cv::imshow("image",img);
cv::waitKey();
return 0;
}
- using
pkg-config
g++ test.cpp `pkg-config --cflags --libs opencv` -o Test
gcc main.c `pkg-config --cflags --libs gtk+-2.0` -o main
~/.bashrc
:
export PKG_CONFIG_PATH=/home/username/local/opencv-3.4.7/lib/pkgconfig:$PKG_CONFIG_PATH
/home/username/local/opencv-3.4.7/lib/pkgconfig/opencv.pc
:
# Package Information for pkg-config
prefix=/home/username/local/opencv-3.4.7
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/include
Name: OpenCV
Description: Open Source Computer Vision Library
Version: 3.4.7
Libs: -L${exec_prefix}/lib -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_cvv -lopencv_dnn_objdetect -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_hfs -lopencv_img_hash -lopencv_line_descriptor -lopencv_optflow -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_sfm -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_highgui -lopencv_videoio -lopencv_dnn -lopencv_plot -lopencv_xfeatures2d -lopencv_shape -lopencv_video -lopencv_ml -lopencv_ximgproc -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core
Libs.private: -ldl -lm -lpthread -lrt -L/usr/lib/x86_64-linux-gnu -lGL -lGLU
Cflags: -I${includedir_old} -I${includedir_new}
g++ `pkg-config --cflags --libs opencv` test.cpp -o Test
- directly use g++ command:
g++ -I(include path) -L(lib path) -l(which libxxx.so) sourefile.cpp -o a.out
-I/usr/local/Cellar/opencv3/3.1.0_1/include/opencv
-I/usr/local/Cellar/opencv3/3.1.0_1/include
-L/usr/local/Cellar/opencv3/3.1.0_1/lib
-lopencv_shape
-lopencv_stitching
-lopencv_objdetect
-lopencv_superres
-lopencv_videostab
-lopencv_flann
-lopencv_calib3d
-lopencv_features2d
-lopencv_videoio
-lopencv_imgcodecs
-lopencv_video
-lopencv_photo
-lopencv_ml
-lopencv_imgproc
-lopencv_core
-lopencv_highgui
username@HOME:~/wk/exp6/scc$ g++ main.cpp -o a.out -I/home/username/local/opencv-3.4.7/include -L/home/username/local/opencv-3.4.7/lib/ -lopencv_core
/tmp/ccje9Ael.o: In function `main':
main.cpp:(.text+0x48): undefined reference to `cv::imread(cv::String const&, int)'
main.cpp:(.text+0x9c): undefined reference to `cv::imshow(cv::String const&, cv::_InputArray const&)'
main.cpp:(.text+0xc4): undefined reference to `cv::waitKey(int)'
collect2: error: ld returned 1 exit status
username@HOME:~/wk/exp6/scc$ g++ main.cpp -o a.out -I/home/username/local/opencv-3.4.7/include -L/home/username/local/opencv-3.4.7/lib/ -lopencv_core -lopencv_highgui
/usr/bin/ld: /tmp/cclltTat.o: undefined reference to symbol '_ZN2cv6imreadERKNS_6StringEi'
//home/username/local/opencv-3.4.7/lib/libopencv_imgcodecs.so.3.4: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
username@HOME:~/wk/exp6/scc$ g++ main.cpp -o a.out -I/home/username/local/opencv-3.4.7/include -L/home/username/local/opencv-3.4.7/lib/ -lopencv_core -lopencv_highgui -lopencv_imgproc
/usr/bin/ld: /tmp/ccpwjZbD.o: undefined reference to symbol '_ZN2cv6imreadERKNS_6StringEi'
//home/username/local/opencv-3.4.7/lib/libopencv_imgcodecs.so.3.4: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
username@HOME:~/wk/exp6/scc$ g++ main.cpp -o a.out -I/home/username/local/opencv-3.4.7/include -L/home/username/local/opencv-3.4.7/lib/ -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_imgcodecs
- Makefile
CMake
http://blog.csdn.net/lj402159806/article/details/76408597 (安装)
https://www.jianshu.com/p/c042abb42133 (使用教程)
sudo apt-get install cmake
(版本匹配很重要,新版的可以直接从源码编译安装也很简单。对于特定的开发项目可能需要特定的cmake版本,建立一个软连接将/usr/local/bin/目录下就行了)
编写CMakeLists.txt
cmake_minimum_required (VERSION 2.6) //cmake版本配置
project () //项目信息描述,仅仅是个描述而已,好像没任何用处
add_executable (exe src1 src2 ...) //最终的可执行文件, + 使用哪些源文件进行生成
add_library (lib [STATIC|SHARED] src) //生成库文件
target_link_libraries (whichexe whichlib <debug|optimal> lib2 <>...) // 指定将某个库链接到对应的可执行文件中
add_subdirectory ()//添加子文件夹,其中的CMakeList也会递归的处理
aux_source_directory(realdirname NAME) //将所有dir下的所有文件名 添加到变量cmake变量中,引用变量:${NAME}
set(YOURNAME main.cpp pf.cpp) //定义cmake变量
link_directories(dir1 dir2) //添加链接库的搜索路径
include_directories([BEFORE|AFTER] dir1 dir2 ) //添加头文件的搜索路径,before和after用来控制其与当前路径之间的前后关系
add_definitions (-DDEBUG)//添加编译器编译命令行参数
执行cmake .
之后会自动检测系统的各种编译器 生成对应的编译工程文件(通过源码生成编译器需要的整个工程文件如vs的sln和vcxproj工程文件)。
整个过程的错误信息会记录到cmake的log文件中。
编译使用了OpenCV的工程:CMakeList.txt
cmake_minimum_required(VERSION 2.8)
project(opencv)
find_package(OpenCV REQUIRED)
add_executable(opencv opencv.cpp)
target_link_libraries(opencv ${OpenCV_LIBS})
vscode config
https://www.cnblogs.com/YiYA-blog/p/10082635.html
./.vscode/launch.json
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "g++ - Build and debug active file",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "g++",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
tasks.json
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"command": "g++",
"args": [
"-g", "-std=c++11", "${file}", "-o", "${fileBasenameNoExtension}",//"main.cpp", "text.cpp","-o","a.out",
"-I", "/home/username/local/opencv-3.4.7/include",
"-I", "/home/username/local/opencv-3.4.7/include/opencv",
"-I", "/home/username/local/opencv-3.4.7/opencv2",
"-L", "/home/username/local/opencv-3.4.7/lib",
"-l", "opencv_core",
"-l", "opencv_imgproc",
"-l", "opencv_imgcodecs",
"-l", "opencv_video",
"-l", "opencv_ml",
"-l", "opencv_highgui",
"-l", "opencv_objdetect",
"-l", "opencv_flann",
"-l", "opencv_imgcodecs",
"-l", "opencv_photo",
"-l", "opencv_videoio"
],// g++编译命令参数
"problemMatcher":{
"owner": "cpp",
"fileLocation":[
"relative",
"${workspaceFolder}"
],
"pattern":[
{
"regexp": "^([^\\\\s].*)\\\\((\\\\d+,\\\\d+)\\\\):\\\\s*(.*)$",
"file": 1,
"location": 2,
"message": 3
}
]
},
"group": {
"kind": "build",
"isDefault": true
}
}
For vscode
c_cpp_properties.json:
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/home/username/local/opencv-3.4.7/include",
"/home/username/local/opencv-3.4.7/include/opencv2",
"/home/username/local/opencv-3.4.7/include/opencv"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "clang-x64"
}
],
"version": 4
}
ctrl+shift+B compile
https://blog.csdn.net/u014267567/article/details/53842915 OpenCV中实现MATLAB中的conv2函数
gcc
gcc 命令几个重要选项:
-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号,不用该标志外部程序无法连接。相当于一个可执行文件)。
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
-L.:表示要连接的库在当前目录中。
-lxx:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称(libxx.so)
修改gcc版本:
- 安装完新的gcc之后,一般是放在/usr/bin/gcc-4.9 附带版本号
- 系统真正使用的是/usr/bin/gcc这个软链接,所以安装完成之只需要将软链接连接到新的gcc上就可以了。
http://blog.csdn.net/autoliuweijie/article/details/50950300
http://blog.csdn.net/keith_bb/article/details/52864851
http://blog.csdn.net/luotuo44/article/details/24836901 ()
http://blog.csdn.net/autoliuweijie/article/details/50950300
-w 不生成任何警告信息
-Wall生成所有警告信息
-o指定生成的文件名(-E,-S,-c说明生成什么样的文件)
-O0~3编译优化
-g生成调试信息
-E只运行预编译(处理include头文件等)不生成文件
-S翻译成汇编语言
-c生成.o二进制目标文件
-I添加额外的头文件搜搜路径,否则系统仅仅在标准目录中搜索(先再当前目录查找then系统目录,定义了-I则先在I目录查找then当前then系统)
-idirafter(-I的目录放到后面)
-include+dir/xxx.h 直接include一个头文件
-L添加额外的库搜索路径
-l连接库(需要放到最后,且要省去前面的lib和后面的.a)
-static使用静态连接库生成
-shared使用动态链接库连接
-MM生成文件关联信息
gcc 后面是需要编译的文件列表(修饰-E,-S,-c),生成控制-o,优化-O,-W,-g,额外的头文件搜索目录-I,库目录-L,库-l
gcc -E main.c > preprocess.txt 预处理
gcc -S main.c 预处理+编译生成汇编文件
gcc -c main.c 生成.o文件
gcc -o a.out main.cpp hello.cpp -lopencv
g++ pkg-config opencv --cflags
opencv.cpp -o opencv pkg-config opencv --libs
gcc main.c pkg-config --cflags --libs gtk+-2.0
-o main
http://blog.csdn.net/luotuo44/article/details/16970841 (c语言编译详解)
编译成库文件:
静态库:
ar -cr libpalm.a add.o sub.o (将目标文件链接成一个静态库文件libxxx.a)
ar -t libpalm.a 查看静态库libpalm.a中包含的.o目标文件
动态库:
http://www.cnitblog.com/windone0109/archive/2008/04/23/42653.html
gcc -c pos_conf.c
gcc -shared -fPCI -o libpos.so pos_conf.o
gcc -o pos main.c -L. -lpos 常用的写到默认路径,不常用的编译时通过参数指明
/etc/ld.so.conf
ldconfig
LD_LIBRARY_PATH
使用c++11:
gcc -o out main.cpp -std=c++11
References:
https://blog.csdn.net/s15810751918/article/details/107705387