C语言怎么进行链接编辑,C语言是如何使链接的

本文指在帮助需要的朋友理解链接的使用

[TOC]

环境准备

源文件 main.c

#include

int main()

{

printf("Hello World from t1 Main!\n");

return 0;

}

编译文件

gcc -v main.c

生成a.out文件执行

54db95182e69

image

编译日志为:

Apple LLVM version 10.0.1 (clang-1001.0.46.4)

Target: x86_64-apple-darwin18.6.0

Thread model: posix

InstalledDir: /Library/Developer/CommandLineTools/usr/bin

"/Library/Developer/CommandLineTools/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.14.0 -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -discard-value-names -main-file-name main.c -mrelocation-model pic -pic-level 2 -mthread-model posix -mdisable-fp-elim -fno-strict-return -masm-verbose -munwind-tables -target-sdk-version=10.14 -target-cpu penryn -dwarf-column-info -debugger-tuning=lldb -target-linker-version 450.3 -v -resource-dir /Library/Developer/CommandLineTools/usr/lib/clang/10.0.1 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk -I/usr/local/include -Wno-atomic-implicit-seq-cst -Wno-framework-include-private-from-public -Wno-atimport-in-framework-header -Wno-quoted-include-in-framework-header -fdebug-compilation-dir /Users/wangshengxing/project/c/gcc/ld/src -ferror-limit 19 -fmessage-length 159 -stack-protector 1 -fblocks -fencode-extended-block-signature -fregister-global-dtors-with-atexit -fobjc-runtime=macosx-10.14.0 -fmax-type-align=16 -fdiagnostics-show-option -fcolor-diagnostics -o /var/folders/d0/z0p0y29541n_z25rrkc8c5xw0000gn/T/main-377173.o -x c main.c

clang -cc1 version 10.0.1 (clang-1001.0.46.4) default target x86_64-apple-darwin18.6.0

ignoring nonexistent directory "/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/local/include"

ignoring nonexistent directory "/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/Library/Frameworks"

#include "..." search starts here:

#include <...> search starts here:

/usr/local/include

/Library/Developer/CommandLineTools/usr/lib/clang/10.0.1/include

/Library/Developer/CommandLineTools/usr/include

/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include

/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks (framework directory)

End of search list.

"/Library/Developer/CommandLineTools/usr/bin/ld" -demangle -lto_library /Library/Developer/CommandLineTools/usr/lib/libLTO.dylib -no_deduplicate -dynamic -arch x86_64 -macosx_version_min 10.14.0 -syslibroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk -o a.out /var/folders/d0/z0p0y29541n_z25rrkc8c5xw0000gn/T/main-377173.o -L/usr/local/lib -lSystem /Library/Developer/CommandLineTools/usr/lib/clang/10.0.1/lib/darwin/libclang_rt.osx.a

连接文件

编译文件

执行

gcc main.c

输出 main.o文件

初步连接

执行

ld main.o -o hello

输出

ld: warning: No version-min specified on command line

Undefined symbols for architecture x86_64:

"_printf", referenced from:

_main in main.o

ld: symbol(s) not found for inferred architecture x86_64

没有找到引用,说明没有找到链接库:

查看链接库

执行:

otool -L a.out

输出:

54db95182e69

image

说明需要连接System库

54db95182e69

image

加入System库

执行

ld -o hello main.o -L/usr/local/lib -lSystem

输出

54db95182e69

image

说明已经链接成功

详细参数说明

版本1

ld -arch x86_64 -macosx_version_min 10.14.0 -o hello main.o -L/usr/local/lib -lSystem

版本2

ld -demangle -lto_library /Library/Developer/CommandLineTools/usr/lib/libLTO.dylib -no_deduplicate -dynamic -arch x86_64 -macosx_version_min 10.14.0 -syslibroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk -o hello main.o -L/usr/local/lib -lSystem /Library/Developer/CommandLineTools/usr/lib/clang/10.0.1/lib/darwin/libclang_rt.osx.a

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CGI通讯录是一个常见的Web应用程序,它允许用户添加、编辑、删除和查看联系人信息。在标准C语言中实现CGI通讯录需要以下步骤: 1. 编写HTML页面:首先需要编写一个HTML页面,包含表单和按钮等元素,用于用户输入和提交联系人信息。 2. 编写CGI程序:使用标准C语言编写一个CGI程序,该程序接收来自HTML页面的请求,并处理用户提交的联系人信息。 3. 连接数据库:使用标准C语言提供的数据库API,连接到数据库并执行查询、插入、更新和删除操作。 4. 处理请求:根据用户提交的请求类型(例如添加、编辑、删除或查看联系人),执行相应的操作,并返回结果页面。 下面是一个简单的示例,演示如何使用标准C语言实现CGI通讯录: HTML页面: ``` <!DOCTYPE html> <html> <head> <title>CGI通讯录示例</title> </head> <body> <h1>CGI通讯录示例</h1> <form method="post" action="/cgi-bin/addressbook.cgi"> <input type="hidden" name="action" value="add"> <label for="name">姓名:</label> <input type="text" id="name" name="name"><br> <label for="phone">电话:</label> <input type="text" id="phone" name="phone"><br> <button type="submit">添加</button> </form> <hr> <table> <tr> <th>姓名</th> <th>电话</th> <th>操作</th> </tr> {% for contact in contacts %} <tr> <td>{{ contact.name }}</td> <td>{{ contact.phone }}</td> <td> <form method="post" action="/cgi-bin/addressbook.cgi"> <input type="hidden" name="action" value="edit"> <input type="hidden" name="id" value="{{ contact.id }}"> <button type="submit">编辑</button> </form> <form method="post" action="/cgi-bin/addressbook.cgi"> <input type="hidden" name="action" value="delete"> <input type="hidden" name="id" value="{{ contact.id }}"> <button type="submit">删除</button> </form> </td> </tr> {% endfor %} </table> </body> </html> ``` CGI程序: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sqlite3.h> #define DATABASE "addressbook.db" typedef struct { int id; char name[100]; char phone[100]; } Contact; void print_header() { printf("Content-Type: text/html\n\n"); } void print_error(const char* message) { print_header(); printf("<p>Error: %s</p>", message); } void print_success(const char* message) { print_header(); printf("<p>%s</p>", message); } void print_contacts(Contact* contacts, int count) { print_header(); printf("<html><head><title>CGI通讯录示例</title></head><body>"); printf("<h1>CGI通讯录示例</h1>"); printf("<form method=\"post\" action=\"/cgi-bin/addressbook.cgi\">"); printf("<input type=\"hidden\" name=\"action\" value=\"add\">"); printf("<label for=\"name\">姓名:</label>"); printf("<input type=\"text\" id=\"name\" name=\"name\"><br>"); printf("<label for=\"phone\">电话:</label>"); printf("<input type=\"text\" id=\"phone\" name=\"phone\"><br>"); printf("<button type=\"submit\">添加</button>"); printf("</form>"); printf("<hr>"); printf("<table>"); printf("<tr><th>姓名</th><th>电话</th><th>操作</th></tr>"); for (int i = 0; i < count; i++) { printf("<tr>"); printf("<td>%s</td>", contacts[i].name); printf("<td>%s</td>", contacts[i].phone); printf("<td>"); printf("<form method=\"post\" action=\"/cgi-bin/addressbook.cgi\">"); printf("<input type=\"hidden\" name=\"action\" value=\"edit\">"); printf("<input type=\"hidden\" name=\"id\" value=\"%d\">", contacts[i].id); printf("<button type=\"submit\">编辑</button>"); printf("</form>"); printf("<form method=\"post\" action=\"/cgi-bin/addressbook.cgi\">"); printf("<input type=\"hidden\" name=\"action\" value=\"delete\">"); printf("<input type=\"hidden\" name=\"id\" value=\"%d\">", contacts[i].id); printf("<button type=\"submit\">删除</button>"); printf("</form>"); printf("</td>"); printf("</tr>"); } printf("</table>"); printf("</body></html>"); } void add_contact(sqlite3* db, const char* name, const char* phone) { char* error; char sql[100]; sprintf(sql, "INSERT INTO contacts (name, phone) VALUES ('%s', '%s')", name, phone); if (sqlite3_exec(db, sql, NULL, NULL, &error) != SQLITE_OK) { print_error(error); } else { print_success("联系人添加成功!"); } } void edit_contact(sqlite3* db, int id, const char* name, const char* phone) { char* error; char sql[100]; sprintf(sql, "UPDATE contacts SET name='%s', phone='%s' WHERE id=%d", name, phone, id); if (sqlite3_exec(db, sql, NULL, NULL, &error) != SQLITE_OK) { print_error(error); } else { print_success("联系人更新成功!"); } } void delete_contact(sqlite3* db, int id) { char* error; char sql[100]; sprintf(sql, "DELETE FROM contacts WHERE id=%d", id); if (sqlite3_exec(db, sql, NULL, NULL, &error) != SQLITE_OK) { print_error(error); } else { print_success("联系人删除成功!"); } } int get_contacts(sqlite3* db, Contact** contacts) { sqlite3_stmt* stmt; const char* tail; int count = 0; if (sqlite3_prepare_v2(db, "SELECT id, name, phone FROM contacts", -1, &stmt, &tail) == SQLITE_OK) { count = sqlite3_column_count(stmt); *contacts = malloc(sizeof(Contact) * count); for (int i = 0; i < count; i++) { (*contacts)[i].id = sqlite3_column_int(stmt, 0); strcpy((*contacts)[i].name, sqlite3_column_text(stmt, 1)); strcpy((*contacts)[i].phone, sqlite3_column_text(stmt, 2)); } sqlite3_finalize(stmt); } return count; } int main() { sqlite3* db; if (sqlite3_open(DATABASE, &db) != SQLITE_OK) { print_error("无法连接到数据库!"); return 1; } char* query; char* method = getenv("REQUEST_METHOD"); if (!strcmp(method, "POST")) { int content_length = atoi(getenv("CONTENT_LENGTH")); query = malloc(content_length + 1); fgets(query, content_length + 1, stdin); } else { query = getenv("QUERY_STRING"); } char* action = strtok(query, "&="); if (!strcmp(action, "action")) { char* value = strtok(NULL, "&="); if (!strcmp(value, "add")) { char* name = strtok(NULL, "&="); char* phone = strtok(NULL, "&="); add_contact(db, name, phone); } else if (!strcmp(value, "edit")) { char* id_str = strtok(NULL, "&="); char* name = strtok(NULL, "&="); char* phone = strtok(NULL, "&="); int id = atoi(id_str); edit_contact(db, id, name, phone); } else if (!strcmp(value, "delete")) { char* id_str = strtok(NULL, "&="); int id = atoi(id_str); delete_contact(db, id); } } Contact* contacts; int count = get_contacts(db, &contacts); print_contacts(contacts, count); sqlite3_close(db); return 0; } ``` 说明: 1. 该程序使用SQLite数据库,需要在编译时链接SQLite库,例如: ``` gcc -o addressbook.cgi addressbook.c -lsqlite3 ``` 2. 该程序使用了模板引擎,使用了类似于Django中的模板语法,可以在程序中自定义模板,这里只是简单地演示一下。 3. 该程序中的SQL语句没有进行参数化处理,存在SQL注入的风险,实际应用中应该使用参数化查询。 4. 该程序中的错误处理比较简单,只是将错误信息输出到页面上,实际应用中应该考虑更完善的错误处理方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值