cpp项目能力

cpp项目能力

头文件

2021年8月21日

开源组件性能测试之后,主管要求将其集成到项目中,小组某员工提到源码编译,静态库,动态库。
把源码弄到项目源码中,一起进行编译,在项目源码需要使用组件的地方include
先编译好动态库,再在项目源码中进行链接。(编译的时候需要链接吗)
先编译好静态库,再在编译项目源码的时将其链接上?(这特么跟动态库不是一样的吗)
卧槽,静态库比动态库大好多,但是静态库删掉可以继续运行编译好的可执行文件。

然后搜了下静态库,以及把开源组件集成到项目中需不需要先进行静态库的编译。突然发现一位老哥的解释:“静态库就是一系列打包好的.o文件,可以没有头文件等”。
卧槽?可以没有头文件?头文件和库难道不是绑定关系吗?于是试了一下,确实可以没有头文件,绝了。

头文件应该只是库中函数的一种解释方式。

静态库

静态库其实是一系列.o文件的打包

目录:

(base) ubuntu@VM-8-7-ubuntu:~/cppproject/codeso$ tree ../code
../code
├── hello.cpp
├── hello.h
├── hello.o
├── libhello.a
├── main
└── main.cpp

0 directories, 6 files

hello.cpp

#include "hello.h"
void Hello()
{	printf("Hello World!!!\n");}

hello.h

#ifndef __HELLO_H__
#define __HELLO_H__
#include <stdio.h>
void Hello();
#endif

main.cpp

###############无头文件版###############
void Hello();
int main(void){
    Hello();
    return 0;
}
###############有头文件版###############
#include "hello.h"
int main(void){
    Hello();
    return 0;
}

编译脚本

g++ -c hello.cpp # 编译生成 hello.o
ar cr libhello.a hello.o # 生成静态库文件
g++ -o main main.cpp -static -lhello -L. # 链接生成可执行文件

关于链接生成可执行文件的参数

g++ -o main main.cpp -static -lhello
/usr/bin/ld: cannot find -lhello
collect2: error: ld returned 1 exit status
###############无头文件版###############
g+= -o main main.cpp hello.o

-L参数指定了,额外的库文件搜索路径

动态库

(base) ubuntu@VM-8-7-ubuntu:~/cppproject/codeso$ tree .
.
├── hello.cpp
├── hello.h
├── hello.o
├── libhello.so
├── main
└── main.cpp

0 directories, 6 files

hello.cpp

#include "hello.h"
void Hello()
{    printf("Hello World!!!\n");}

hello.h

#ifndef __HELLO_H__
#define __HELLO_H__
#include <stdio.h>
void Hello();
#endif

main.cpp

#include "hello.h"
int main(void){
    Hello();
    return 0;
}

编译脚本

g++ -c fPIC hello.cpp -o hello.o # 编译生成 hello.o
g++ -shared hello.o -o libhello.so # 生成动态库文件
g++ -o main main.cpp -lhello -L. -Wl,-rpath=$(pwd) # 链接生成可执行文件

cmake创建动态库

(base) ubuntu@VM-8-7-ubuntu:~/cppproject/codecmake$ tree .
.
├── codecmakelib
│   ├── build
│   ├── CMakeLists.txt
│   └── lib
│       ├── CMakeLists.txt
│       ├── hello.cpp
│       ├── hello.h
│       └── libhello.so
└── codecmakesrc
    ├── build
    ├── CMakeLists.txt
    └── src
        ├── CMakeLists.txt
        └── main.cpp

/home/ubuntu/cppproject/codecmake/codecmakelib/CMakeLists.txt

PROJECT(HELLOLIB)
ADD_SUBDIRECTORY(lib)

/home/ubuntu/cppproject/codecmake/codecmakelib/lib/CMakeLists.txt

SET(LIBHELLO_SRC hello.cpp)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
INSTALL(TARGETS hello hello LIBRARY DESTINATION lib)
# INSTALL(FILES hello.h)

/home/ubuntu/cppproject/codecmake/codecmakesrc/CMakeLists.txt

PROJECT(NEWHELLO)
ADD_SUBDIRECTORY(src)

/home/ubuntu/cppproject/codecmake/codecmakesrc/src/CMakeLists.txt

# Passed
# ADD_EXECUTABLE(main main.cpp)
# INCLUDE_DIRECTORIES(/home/ubuntu/cppproject/codecmake/codecmakelib/lib)
# TARGET_LINK_LIBRARIES(main /home/ubuntu/cppproject/codecmake/codecmakelib/lib/libhello.so)

# Passed
# find_library(HELLO_LIB libhello.so /home/ubuntu/cppproject/codecmake/codecmakelib/lib)
# ADD_EXECUTABLE(main main.cpp)
# INCLUDE_DIRECTORIES(/home/ubuntu/cppproject/codecmake/codecmakelib/lib)
# TARGET_LINK_LIBRARIES(main ${HELLO_LIB})

# Passed
# link_libraries(/home/ubuntu/cppproject/codecmake/codecmakelib/lib/libhello.so)
# ADD_EXECUTABLE(main main.cpp)
# INCLUDE_DIRECTORIES(/home/ubuntu/cppproject/codecmake/codecmakelib/lib)
# message(STATUS "" ${CMAKE_SOURCE_DIR})

# Passed
link_libraries(${CMAKE_SOURCE_DIR}/../codecmakelib/lib/libhello.so)
ADD_EXECUTABLE(main main.cpp)
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/../codecmakelib/lib)
message(STATUS "" ${CMAKE_SOURCE_DIR})

posted on 2021-07-20 08:37  ctrlplayer  阅读(121)  评论(0)    收藏  举报

导航