使用静态库链接,编译和运行c程序

时间:2017-02-26 00:10:00

标签: c cmake static-libraries static-linking

我是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})

问题。如何使用静态库使我的程序工作?

2 个答案:

答案 0 :(得分:0)

我必须改变一些事情才能让你的榜样发挥作用:

  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})
    

答案 1 :(得分:0)

这一行:

printf("Hello, World!\n", add(1, 2)); // error

在编译时生成错误,而不是链接时间

原因是printf()函数作为第一个参数(格式字符串)Hello, World!\n和第二个参数传递:add(1,2)但是,格式中没有格式说明符调用add()

结果的字符串

编译器将输出消息:

warning: too many arguments for format [-Wformat-extra-args]

在纠正编译问题之前,没有理由查看Cmakelists.txt文件