C++系列1:安装与编译

1. 基础

1.1 IDE

首先安装clion。试用期过了的话,就把jetbrain-agent挪开,然后重新安装一遍clion,然后再将jetbrain-agen挪回来即可。
新建一个untitled,会自动打开CMakeList.txt,真好。按ctrl+R执行;还能debug,数值就显示在旁边;还有错误提示;不要太好用了啊。下面是最简单的一个例子:

using namespace std;
typedef struct {
    int x;
    int y;
} Coor;

int main() {
    Coor c1{10,20};
    cout << c1.x<<","<< c1.y << endl;
    return 0;
}

注意编译器的设置,cc和c++的位置要选对。
在这里插入图片描述

1.2 编译器配置

使用g++ -v命令查看编译器,一般是GNU编译器。
$ export CXX=g++ CC=gcc
或者指定位置:

export CC=/usr/bin/gcc
export CXX=/usr/bin/g++

g++ 是将 gcc 默认语言设为 C++ 的一个特殊的版本,链接时它自动使用 C++ 标准库而不用 C 标准库。通过遵循源码的命名规范并指定对应库的名字,用 gcc 来编译链接 C++ 程序是可行的,如下例所示:
$ gcc main.cpp -lstdc++ -o main
或者用最简单的编译方式:
$ g++ helloworld.cpp
由于命令行中未指定可执行程序的文件名,编译器采用默认的 a.out。程序可以这样来运行:
$ ./a.out

1.3 编译选项

编译有多种选择,编译成可执行文件:g++ staticMath.cpp -o staticMath
编译成动态库:g++ func.cpp -o func.o -c -fPIC
g++ func.o -shared -o libfunc.so
注意-Lfaiss. -lfaiss的意思不一样

1.4 cmakelists

cmakelists可以将复杂的链接关系梳理清楚。通常一个CMakeLists.txt必须的内容如下:

  • 标题和变量设置
# 本CMakeLists.txt的project名称
# 会自动创建两个变量,PROJECT_SOURCE_DIR和PROJECT_NAME
# ${PROJECT_SOURCE_DIR}:本CMakeLists.txt所在的文件夹路径
# ${PROJECT_NAME}:本CMakeLists.txt的project名称
project(xxx)

# 获取路径下所有的.cpp/.c/.cc文件,并赋值给变量中
aux_source_directory(. SRC_LIST) # 搜索当前目录下的所有.cpp文件
# add_library(demo ${SRC_LIST})

# 给文件名/路径名或其他字符串起别名,用${变量}获取变量内容
set(变量 文件名/路径/...)
  • 保存选项
# 添加编译选项
add_definitions(编译选项)

# 将.cpp/.c/.cc文件生成.a静态库
# 注意,库文件名称通常为libxxx.so,在这里只要写xxx即可
add_library(库文件,第二个参数如果没有则默认)

# 将.cpp/.c/.cc文件生成可执行文件
add_executable(可执行文件名称 文件)

# 对add_library或add_executable生成的文件进行链接操作
# 注意,库文件名称通常为libxxx.so,在这里只要写xxx即可
target_link_libraries(库文件名称/可执行文件名称 链接的库文件名称)

# 打印消息
message(消息)
  • 目录
# 编译子文件夹的CMakeLists.txt
add_subdirectory(子文件夹名称)

# 规定.h头文件路径
include_directories(路径)

# 规定.so/.a链接库文件路径,但是还不能直接用,要添加附件
# 也可以用find package和find library找到库文件的路径
link_directories(路径)

包含其它 cmake 文件
include(./common.cmake) # 指定包含文件的全路径
include(def) # 在搜索路径中搜索def.cmake文件
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) # 设置include的搜索路径
  • 附件
target_link_libraries(demo libface.a) # 链接libface.a

1.5 cmakelists中的变量和流程控制

  1. 设置和使用变量:
set(ECHO_HELLO "world")
message("hello: ${ECHO_HELLO}")
  1. if和foreach
if(WIN32)
    message("This is win32 platform")
else()
    message("This is not win32 platform")
endif()

set(FOR_LIST demo1.cpp demo2.cpp demo3.cpp)
foreach (f ${FOR_LIST})
    message("now is file: " ${f})
endforeach ()

2. find_package使用第三方库

2.1 基础

当编译一个需要使用第三方库的软件时,我们需要知道:

  1. 去哪儿找头文件 .h:include_directories(${PROJECT_SOURCE_DIR}/include)
  2. 去哪儿找库文件 (.so/.dll/.lib/.dylib/…) :link_directories(${PROJECT_SOURCE_DIR}/lib)
  3. 需要链接的库文件的名字:target_link_libraries(demo math gflags)

2.2 find_package的作用

使用find_package能找到上述前两者的位置,下面是个例子:

find_package(CURL REQUIRED)
include_directories(${CURL_INCLUDE_DIR})
target_link_libraries(curltest ${CURL_LIBRARY})

可以查看系统里面有哪些已经可以直接用的:
在这里插入图片描述
这些东西放在下面的目录中
在这里插入图片描述
cmake 会将路径赋值给对应的变量:
在这里插入图片描述

2.3 opencv示例

opencv不同版本的使用是个很令人头疼的问题。这里假设我们的opencv 安装在指定的目录,不是系统的目录。首先,找到opencv的cmake文件夹:
在这里插入图片描述

要做的事情如下:

  1. 设置cmake模块位置,使用set **_dir的方式
  2. 调用find_package方法
  3. 正常使用include_directories和target_link_libraries,注意要enable auto change,使得每次修改即时生效。让我们来测试一下:我们看到,编译后打印出了正确的信息
    在这里插入图片描述

下面是测试结果:
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值