使用静态库链接、编译和 运行 一个 c 程序
linking, compiling and running a c program with a static library
我是 C 语言开发新手。
A 我在 CLion
中构建了一个库(静态)
library.h
#ifndef MYLIB_LIBRARY_H
#define MYLIB_LIBRARY_H
int add(int a, int b);
int sub(int a, int b);
#endif
library.c
#include "library.h"
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int sub(int a, int b) {
return a - b;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.6)
project(MyLib)
set(CMAKE_C_STANDARD 99)
set(SOURCE_FILES library.c library.h)
add_library(MyLib ${SOURCE_FILES})
B. 创建了名为 App 的 C 可执行项目并将 libMyLib.a
复制到 App 的 lib 目录中。
main.c
#include <stdio.h>
#include "library.h" // error
int main() {
printf("Hello, World!\n", add(1, 2)); // error
return 0;
}
项目App的CMakeLists.txt和链接器指定的文件夹。
cmake_minimum_required(VERSION 3.6)
project(App)
set(CMAKE_C_STANDARD 99)
set(SOURCE_FILES main.c)
link_directories(${PROJECT_SOURCE_DIR}/lib)
add_executable(App ${SOURCE_FILES})
问题。如何使用静态库使我的程序运行?
为了使您的示例正常工作,我必须更改一些内容:
- 在App目录下创建一个
include
目录。
- 将
library.h
放入此包含目录。
修改项目CMakeLists.txt文件:
cmake_minimum_required(VERSION 3.6)
project(App)
set(CMAKE_C_STANDARD 99)
set(SOURCE_FILES main.c)
# get libMyLib.a
find_library(MY_LIB
NAMES libMyLib.a
PATHS ${PROJECT_SOURCE_DIR}/lib)
# get library.h
include_directories(${PROJECT_SOURCE_DIR}/include)
add_executable(App ${SOURCE_FILES})
# link App with libMyLib.a
target_link_libraries(App ${MY_LIB})
这一行:
printf("Hello, World!\n", add(1, 2)); // error
在编译时产生错误,而不是 link 时
原因是 printf()
函数作为第一个参数(格式字符串)Hello, World!\n
和第二个参数传递:add(1,2)
但是,没有格式说明符add()
调用结果的格式字符串
编译器将输出消息:
warning: too many arguments for format [-Wformat-extra-args]
在更正编译问题之前没有理由查看 Cmakelists.txt 文件
我是 C 语言开发新手。
A 我在 CLion
中构建了一个库(静态)library.h
#ifndef MYLIB_LIBRARY_H
#define MYLIB_LIBRARY_H
int add(int a, int b);
int sub(int a, int b);
#endif
library.c
#include "library.h"
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int sub(int a, int b) {
return a - b;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.6)
project(MyLib)
set(CMAKE_C_STANDARD 99)
set(SOURCE_FILES library.c library.h)
add_library(MyLib ${SOURCE_FILES})
B. 创建了名为 App 的 C 可执行项目并将 libMyLib.a
复制到 App 的 lib 目录中。
main.c
#include <stdio.h>
#include "library.h" // error
int main() {
printf("Hello, World!\n", add(1, 2)); // error
return 0;
}
项目App的CMakeLists.txt和链接器指定的文件夹。
cmake_minimum_required(VERSION 3.6)
project(App)
set(CMAKE_C_STANDARD 99)
set(SOURCE_FILES main.c)
link_directories(${PROJECT_SOURCE_DIR}/lib)
add_executable(App ${SOURCE_FILES})
问题。如何使用静态库使我的程序运行?
为了使您的示例正常工作,我必须更改一些内容:
- 在App目录下创建一个
include
目录。 - 将
library.h
放入此包含目录。 修改项目CMakeLists.txt文件:
cmake_minimum_required(VERSION 3.6) project(App) set(CMAKE_C_STANDARD 99) set(SOURCE_FILES main.c) # get libMyLib.a find_library(MY_LIB NAMES libMyLib.a PATHS ${PROJECT_SOURCE_DIR}/lib) # get library.h include_directories(${PROJECT_SOURCE_DIR}/include) add_executable(App ${SOURCE_FILES}) # link App with libMyLib.a target_link_libraries(App ${MY_LIB})
这一行:
printf("Hello, World!\n", add(1, 2)); // error
在编译时产生错误,而不是 link 时
原因是 printf()
函数作为第一个参数(格式字符串)Hello, World!\n
和第二个参数传递:add(1,2)
但是,没有格式说明符add()
编译器将输出消息:
warning: too many arguments for format [-Wformat-extra-args]
在更正编译问题之前没有理由查看 Cmakelists.txt 文件