簡體   English   中英

使用靜態庫鏈接,編譯和運行ac程序

[英]linking, compiling and running a c program with a static library

我是C開發的新手。

A I在克利翁建庫(靜態)

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

在編譯時而不是鏈接時生成錯誤

原因是將printf()函數作為第一個參數(格式字符串)傳遞給Hello, World!\\n和第二個參數: add(1,2)但是,格式字符串中沒有用於格式的說明符。調用add()

編譯器將輸出消息:

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

在更正編譯問題之前,沒有理由要查看Cmakelists.txt文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM