我有一个类,我想std::string通过getter 存储一个真正的const或有效const 的静态.
我尝试了几种直接方法
1.
const static std::string foo = "bar";
2.
const extern std::string foo; //defined at the bottom of the header like so
...//remaining code in header
}; //close header class declaration
std::string MyClass::foo = "bar"
/#endif // MYCLASS_H
我也试过了
3.
protected:
static std::string foo;
public:
static std::string getFoo() { return foo; }
这些方法分别因以下原因而失败:
const string MyClass::foo非文字类型的静态数据成员的类内初始化foo- 它似乎不喜欢extern与const或组合static我想在头文件而不是源文件中使用声明的原因.这是一个将被扩展的类,它的所有其他函数都是纯虚拟的,所以我目前除了这些变量之外没有其他原因要有源文件.
那么怎么做呢?
我在分叉的github上有一个elisp项目.我不想改变一些源文件和函数,有些我想彻底改变,有些只是稍微改变.每个源文件顶部的原始版权提到它来自的项目.
1)我应该重命名所有功能还是仅重命名代码(无论多么小)?
2)如果我修改文件中的某些功能但不是全部/大多数我应该重命名该文件并更改顶部的版权以反映我的项目而不是原始项目?
3)如果重命名了许多/所有文件,我应该如何归功于原作者(除了他们在git log中出现的提交)?
笔记
我正在分叉,因为我希望将代码从与原始声明目的完全不同的方向运用,并且我的分叉不会被原作者拉进去.
原始项目和我的fork都使用GPLv3
按约定,Elisp代码使用项目名称作为函数/变量的名称的前缀,以避免命名空间冲突.
**编辑**
发布后发现了一些额外的信息......
1)当然.事实上,不改变它至少会意味着它是原始项目,这是一个坏主意.
2)您无法删除版权声明.添加你的.
3)为什么要删除旧项目的引用?这是一个建议,但删除它将是不礼貌的,可能会产生误导.开源/自由软件社区重视正确的归属.
需要有关源头中经过大量修改的OSS代码(BSD,Apache等)的归属/版权的建议
如果您从文件中复制一个函数,除非您可以说服法院认为该函数对于版权的申请过于琐碎,那么源文件的许可证将保留在该函数中
在Stefan的回答和这些stackoverflow帖子之间,我决定:
1)重命名所有文件和函数,即使没有更改也可以使用我的项目名称.
2)保留所有现有文件中的原始版权(以及将旧代码移动到更逻辑的细分中产生的一些新文件)
3)将我的版权添加到所有新旧文件中.
4)在旧版权之上做一个注释,以便在某个提交ID之前检查git历史记录以查看fork时的原始项目以及对原始项目的url的引用以查看最新版本.
我认为这些更改应该明确指出这是一个单独的项目,同时保留原始信用,避免任何命名空间冲突或侵犯版权.
问题
我无法加载并将已编译的c类中的方法调用到leiningen项目中.我的基本方法是加载一个Java类JavaWrapper.java,它使用JNI调用本机代码中的一些本机方法,wrapper.o然后通过这个java包装类调用方法.
我想有一个classLoader问题,加载一个java类,它从clojure项目加载本机代码,但鉴于我似乎无法直接获取clojure代码在库路径上找到wrapper.o,我不确定如何处理这个.
列宁项目文件
(defproject lein-native-test "0.1.0-SNAPSHOT"
...
:java-source-paths ["java-path"]
:jvm-opts ["-Djava.library.path=.:./native:/absolute/path/to/native"] ;;not sure what format it wants
)
Run Code Online (Sandbox Code Playgroud)
使用main方法的clojure文件
我尝试使用四种方法稍微修改它们,所有这些都包含在下面的代码中以及注释中的相应错误.
(ns lein-native-test.core
(:import (com.test JavaWrapper)))
(def -main []
;;four things I've tried and their errors
(clojure.lang.RT.load "/abs/path/to/wrapper.o") ;;could not find file /abs/path/wrapper.o_init.class or wrapper.o.clj
(clojure.lang.RT.loadLibrary "wrapper.o") ;;UnsatisfiedLinkError no wrapper.o in java library path
(JavaWrapper/load "/abs/path/to/wrapper.o") ;;UnsatisfiedLinkError com.test.JavaWrapper.setup()
(assembly-load "/abs/path/to/wrapper.o") ;;unable to resolvesymbol: assembly-load
)
Run Code Online (Sandbox Code Playgroud)
使用JNI,JavaWrapper.java的本机方法的Java代码
public class JavaWrapper{
public native void setup();
public static void load(String lib){ System.load(lib);}
} …Run Code Online (Sandbox Code Playgroud)