如何在没有定义main()的情况下让cgo构建目标文件?

时间:2018-01-05 00:55:47

标签: c go cgo gccgo

我有一个完全用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中。我已经在下面发布了正确的解决方案,这要归功于我已经记入的另一位用户。

1 个答案:

答案 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