我有一个完全用C编写的项目。我只需要调用一个必须在GO中编码的函数。因此我使用cgo来构建C文件,然后我想使用生成的目标文件链接到我的主C项目。
假设我有一个文件@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
userAuth = current_user.is_authenticated
if form.validate_on_submit():
flash("Login attempt logged")
user = User.query.filter_by(username=form.userID.data).first()
if user:
checkPass = form.password.data.encode('utf-8')
if bcrypt.checkpw(checkPass, user.password):
user.authenticated = True
login_user(user, remember=form.remember_me.data)
return redirect(url_for('index', _external=True))
else:
form.errors['password'] = 'false'
else:
form.errors['username'] = 'false'
else:
return render_template('login.html',
title='Log In',
loggedIn=userAuth,
form=form)
,只有一个函数foo.go
。我希望从我的C代码中执行此函数。
所以我做了以下步骤
func HelloWorld()
现在我有两个文件:
# go tool cgo foo.go
# cd _obj && gcc -c *.o
但是,# _cgo_export.o _cgo_main.o
正在以某种方式定义,我无法将这些目标文件与我的主项目(多个主电源)链接。
如何让cgo不放入虚拟主体?或者我这样做完全错了吗?
编辑我需要入口点在C中。其他人发布的建议要求入口点在GO中。我已经在下面发布了正确的解决方案,这要归功于我已经记入的另一位用户。
答案 0 :(得分:0)
@alexander(https://stackoverflow.com/users/131264/alexander)的回答解决了这个问题。
如果你使用gccgo,这不是一个令人困惑的主张。这可以在这里工作:
<强> foo.go 强>
package main
func Add(a, b int) int {
return a + b
}
<强> bar.c 强>
#include <stdio.h>
extern int go_add(int, int) __asm__ ("example.main.Add");
int main() {
int x = go_add(2, 3);
printf("Result: %d\n", x);
}
<强>生成文件强>
all: main
main: foo.o bar.c
gcc foo.o bar.c -o main
foo.o: foo.go
gccgo -c foo.go -o foo.o -fgo-prefix=example
clean:
rm -f main *.o