使用静态库链接、编译和 运行 一个 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})

问题。如何使用静态库使我的程序运行?

为了使您的示例正常工作,我必须更改一些内容:

  1. 在App目录下创建一个include目录。
  2. library.h 放入此包含目录。
  3. 修改项目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 文件